From 1a170bfbd599b2c3346a879c31bdbc9c683231d7 Mon Sep 17 00:00:00 2001 From: Niels Simenon Date: Mon, 18 Mar 2019 04:46:53 +0100 Subject: [PATCH] Added Jules Jordan scraper. Added render argument to stop going into ncurses mode during dev. --- config/default.js | 1 + networks.js | 34 ++++++ package-lock.json | 235 ++++++++++++++++++++++++++++++++---- package.json | 3 +- src/app.js | 11 +- src/argv.js | 13 ++ src/scrapers/index.js | 6 +- src/scrapers/julesjordan.js | 83 +++++++++++++ src/scrapers/pervcity.js | 7 +- src/scrapers/xempire.js | 12 +- src/tui/formatters.js | 4 + src/tui/render.js | 44 ++++--- 12 files changed, 394 insertions(+), 59 deletions(-) create mode 100644 src/argv.js create mode 100644 src/scrapers/julesjordan.js diff --git a/config/default.js b/config/default.js index 7a5b0cf02..b9aa4e237 100644 --- a/config/default.js +++ b/config/default.js @@ -3,6 +3,7 @@ module.exports = { include: [ 'xempire', + 'julesjordan', 'pervcity', ], columns: [ diff --git a/networks.js b/networks.js index 11cb93b5c..ecf7dbefe 100644 --- a/networks.js +++ b/networks.js @@ -2,6 +2,40 @@ /* eslint-disable max-len */ module.exports = { + julesjordan: { + name: 'Jules Jordan', + url: 'https://www.julesjordan.com/trial', + sites: { + julesjordan: { + name: 'Jules Jordan', + label: 'julesj', + url: 'https://www.julesjordan.com/trial', + description: 'Jules Jordan\'s Official Membership Site', + }, + /* also listed on main site + manuel: { + name: 'Manuel Ferrara', + label: 'manuel', + url: 'http://www.manuelferrara.com/trial', + description: 'Manuel Ferrara\'s Official Site', + }, + */ + /* no listed date + theassfactory: { + name: 'The Ass Factory', + label: 'assfac', + url: 'https://www.theassfactory.com/trial', + }, + */ + /* no updates since 2016 + spermswallowers: { + name: 'Sperm Swallowers', + label: 'sperms', + url: 'https://www.spermswallowers.com/trial', + }, + */ + }, + }, xempire: { name: 'XEmpire', url: 'https://www.xempire.com/en', diff --git a/package-lock.json b/package-lock.json index b0957b3d5..18461f6c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1688,8 +1688,7 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "end-of-stream": { "version": "1.4.1", @@ -2833,9 +2832,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-stream": { "version": "4.1.0", @@ -3440,13 +3439,20 @@ } }, "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", + "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", + "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", + "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==" + } } }, "micromatch": { @@ -3478,7 +3484,8 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "minimatch": { "version": "3.0.4", @@ -4112,9 +4119,9 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "resolve": { "version": "1.10.0", @@ -4276,6 +4283,84 @@ "breakword": "^1.0.3", "wcwidth": "^1.0.1", "yargs": "^12.0.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "snapdragon": { @@ -4769,6 +4854,54 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, "strip-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", @@ -4776,6 +4909,34 @@ "requires": { "ansi-regex": "^4.1.0" } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -5043,24 +5204,28 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "requires": { "cliui": "^4.0.0", - "decamelize": "^1.2.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -5098,13 +5263,31 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", + "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index c6f69f61d..85e3d9174 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "moment": "^2.24.0", "neo-blessed": "^0.2.0", "opn": "^5.4.0", - "tty-table": "^2.7.0" + "tty-table": "^2.7.0", + "yargs": "^13.2.2" } } diff --git a/src/app.js b/src/app.js index 694df8f2d..72a8dff00 100644 --- a/src/app.js +++ b/src/app.js @@ -4,6 +4,7 @@ const config = require('config'); const moment = require('moment'); const blessed = require('neo-blessed'); +const argv = require('./argv'); const networks = require('../networks.js'); const scrapers = require('./scrapers'); const render = require('./tui/render'); @@ -115,13 +116,15 @@ async function fetchScenes(sites) { } async function init() { - const screen = initScreen(); - const sites = accumulateSites(); const scenes = await fetchScenes(sites); - const sortedScenes = scenes.sort(({ date: dateA }, { date: dateB }) => moment(dateB).diff(dateA)); - render(sortedScenes, screen); + if (argv.render) { + const screen = initScreen(); + const sortedScenes = scenes.sort(({ date: dateA }, { date: dateB }) => moment(dateB).diff(dateA)); + + render(sortedScenes, screen); + } } init(); diff --git a/src/argv.js b/src/argv.js new file mode 100644 index 000000000..2790bb69c --- /dev/null +++ b/src/argv.js @@ -0,0 +1,13 @@ +'use strict'; + +const yargs = require('yargs'); + +const { argv } = yargs + .command('npm start') + .option('render', { + describe: 'Fetch data without rendering interface', + type: 'boolean', + default: true, + }); + +module.exports = argv; diff --git a/src/scrapers/index.js b/src/scrapers/index.js index 7a05d10b9..7a5c4c411 100644 --- a/src/scrapers/index.js +++ b/src/scrapers/index.js @@ -1,9 +1,11 @@ 'use strict'; -const pervcity = require('./pervcity'); const xempire = require('./xempire'); +const julesjordan = require('./julesjordan'); +const pervcity = require('./pervcity'); module.exports = { - pervcity, xempire, + julesjordan, + pervcity, }; diff --git a/src/scrapers/julesjordan.js b/src/scrapers/julesjordan.js new file mode 100644 index 000000000..b95c8a281 --- /dev/null +++ b/src/scrapers/julesjordan.js @@ -0,0 +1,83 @@ +'use strict'; + +const bhttp = require('bhttp'); +const cheerio = require('cheerio'); +const moment = require('moment'); + +function scrapeLatest(html, site) { + const $ = cheerio.load(html, { normalizeWhitespace: true }); + const scenesElements = $('.update_details').toArray(); + + return scenesElements.map((element) => { + const sceneLinkElement = $(element).children('a').eq(1); + const url = sceneLinkElement.attr('href'); + const title = sceneLinkElement.text(); + + const date = moment + .utc($(element).find('.update_date').text(), 'MM/DD/YYYY') + .toDate(); + + const actors = $(element).find('.update_models a') + .map((actorIndex, actorElement) => $(actorElement).text()) + .toArray(); + + return { + url, + title, + actors, + date, + rating: null, + site, + }; + }); +} + +function scrapeUpcoming(html, site) { + const $ = cheerio.load(html, { normalizeWhitespace: true }); + const scenesElements = $('#coming_soon_carousel').find('.table').toArray(); + + return scenesElements.map((element) => { + const details = $(element).find('.update_details_comingsoon') + .eq(1) + .children() + .remove(); + + const title = details + .end() + .text() + .trim(); + + const actors = details + .text() + .trim() + .split(', '); + + const date = moment + .utc($(element).find('.update_date_comingsoon').text().slice(7), 'MM/DD/YYYY') + .toDate(); + + return { + url: null, + title, + actors, + date, + rating: null, + site, + }; + }); +} + + +async function fetchReleases(site) { + const [latestRes, upcomingRes] = await Promise.all([ + bhttp.get(`${site.url}/categories/movies_1_d.html`), + bhttp.get(`${site.url}/index.php`), + ]); + + return [ + ...scrapeUpcoming(upcomingRes.body.toString(), site, true), + ...scrapeLatest(latestRes.body.toString(), site), + ]; +} + +module.exports = fetchReleases; diff --git a/src/scrapers/pervcity.js b/src/scrapers/pervcity.js index 76a9af439..30d88fad8 100644 --- a/src/scrapers/pervcity.js +++ b/src/scrapers/pervcity.js @@ -14,7 +14,10 @@ function scrape(html, site) { const actors = $('.home_model_name a').toArray().map(element => $(element).text().replace(/,[\u0020\u00A0\u202F]/, '')); // replace weird commas const date = moment.utc($('.add_date').text(), 'DD-MM-YYYY').toDate(); - const stars = $('img[src*="/star.png"]').toArray().map(element => $(element).attr('src')).length || null; + const stars = $('img[src*="/star.png"]') + .toArray() + .map(element => $(element).attr('src')) + .length || null; return { url, @@ -31,8 +34,6 @@ function scrape(html, site) { } async function fetchReleases(site) { - // const session = bhttp.session(); - const res = await bhttp.get(`${site.url}/final_latestupdateview.php?limitstart=0&limitend=9&websiteid=0&deviceview=browser&tourId=${site.parameters.tourId}`); const elements = JSON.parse(res.body.toString()); diff --git a/src/scrapers/xempire.js b/src/scrapers/xempire.js index 9fba08289..ceb964de5 100644 --- a/src/scrapers/xempire.js +++ b/src/scrapers/xempire.js @@ -13,16 +13,18 @@ function scrape(html, site) { const url = `${site.url}${sceneLinkElement.attr('href')}`; const title = sceneLinkElement.attr('title'); - const [likes, dislikes] = $(element).find('.value') - .toArray() - .map(value => Number($(value).text())); - const stars = likes || dislikes ? Math.floor(((likes * 5 + dislikes) / (likes + dislikes)) * 100) / 100 : null; + const date = moment + .utc($(element).find('.sceneDate').text(), 'MM-DD-YYYY') + .toDate(); const actors = $(element).find('.sceneActors a') .map((actorIndex, actorElement) => $(actorElement).attr('title')) .toArray(); - const date = moment.utc($(element).find('.sceneDate').text(), 'MM-DD-YYYY').toDate(); + const [likes, dislikes] = $(element).find('.value') + .toArray() + .map(value => Number($(value).text())); + const stars = likes || dislikes ? Math.floor(((likes * 5 + dislikes) / (likes + dislikes)) * 100) / 100 : null; return { url, diff --git a/src/tui/formatters.js b/src/tui/formatters.js index 11bc758b4..03bc27b73 100644 --- a/src/tui/formatters.js +++ b/src/tui/formatters.js @@ -7,6 +7,10 @@ const formatters = { date: (date, column) => moment(date).format(column.format || 'MMM DD, YYYY'), actors: actors => actors.join(', '), rating: (rating) => { + if (rating === null) { + return '\x1b[90mNot available\x1b[0m'; + } + if (rating.stars === null) { return '\x1b[90mUnrated\x1b[0m'; } diff --git a/src/tui/render.js b/src/tui/render.js index 434a84a95..a44d846c9 100644 --- a/src/tui/render.js +++ b/src/tui/render.js @@ -21,7 +21,7 @@ function render(scenes, screen) { : scene[column.value]) .toString(); - const realLength = value.replace(/\x1b\[\d+m/g, '').length; + const realLength = value.replace(/\x1b\[\d+m/g, '').length; // eslint-disable-line no-control-regex const entityLength = value.length - realLength; const truncatedValue = realLength > column.width - 2 ? `${value.slice(0, column.width - 2 - 3)}...` : value; @@ -40,7 +40,30 @@ function render(scenes, screen) { return `${row}${sceneIndex}`; }); - function search(cb) { + const menu = blessed.List({ + style: { + selected: { + bold: true, + }, + }, + top: 1, + height: screen.rows - 3, + width: 161, + keys: true, + vi: true, + mouse: true, + scrollbar: { + style: { + bg: 'red', + }, + track: { + bg: 'blue', + }, + }, + items, + }); + + menu.search = (cb) => { const searchbox = blessed.Textbox({ inputOnFocus: true, }); @@ -57,22 +80,7 @@ function render(scenes, screen) { screen.append(menu); screen.render(); }); - } - - const menu = blessed.List({ - style: { - selected: { - bold: true, - }, - }, - top: 1, - height: screen.rows - 3, - keys: true, - vi: true, - mouse: true, - search, - items, - }); + }; const tableBottom = blessed.Text({ content: config.columns.reduce((acc, column, index) => `${acc}${'─'.repeat(column.width)}${index < config.columns.length - 1 ? '┴' : '┘\x1b[0m\n'}`, '\x1b[30m└'),