Skip to content
This repository was archived by the owner on Jun 14, 2021. It is now read-only.

Commit 5fe2995

Browse files
author
XiaoLin
committed
feat: pre release
1 parent c18d2bf commit 5fe2995

File tree

10 files changed

+357
-4
lines changed

10 files changed

+357
-4
lines changed

database/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*
2+
!.gitignore

database/.gitplaceholder

Whitespace-only changes.

database/db.json

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,20 @@
202202
"title": "jul-133 湯煙の中で誘惑トラップ-。 人妻おっぱいが接触しまくる!密着囁き淫語アカスリ 栗栖みなみ[4.69 GB]",
203203
"size": 4.69,
204204
"torrentURL": "https://pt.m-team.cc/download.php?id=397194&passkey=e611943f06ab05b2a8b5da7243590bc0&https=1"
205+
},
206+
{
207+
"hash": "g54g54gqg54gq54g5g54qg54g54qg54",
208+
"JAVID": "JUL-233",
209+
"title": "jul-233 湯煙の中で誘惑トラップ-。 人妻おっぱいが接触しまくる!密着囁き淫語アカスリ 栗栖みなみ[4.69 GB]",
210+
"size": 4.69,
211+
"torrentURL": "ewg5grethytrejrjejrtjejeyt"
212+
},
213+
{
214+
"hash": "f1af166b37020c4a6bd84012728fc0f6f83980c0",
215+
"JAVID": "JUL-133",
216+
"title": "jul-133 湯煙の中で誘惑トラップ-。 人妻おっぱいが接触しまくる!密着囁き淫語アカスリ 栗栖みなみ[4.69 GB]",
217+
"size": 4.69,
218+
"torrentURL": "https://pt.m-team.cc/download.php?id=397194&passkey=e611943f06ab05b2a8b5da7243590bc0&https=1"
205219
}
206220
],
207221
"downloaded": [],
@@ -288,7 +302,46 @@
288302
"hash": "0cb7932c8f9183160dbbac705ceac87e0e6e6e4f"
289303
},
290304
{
291-
"hash": "8842c1ac3dbd6bd188fb29d619732a7a0d1113dd"
305+
"hash": "f1af166b37020c4a6bd84012728fc0f6f83980c0"
306+
}
307+
],
308+
"metadatas": [
309+
{
310+
"title": "湯煙の中で誘惑トラップ-。 人妻おっぱいが接触しまくる!密着囁き淫語アカスリ 栗栖みなみ",
311+
"cover": "https://pics.javbus.com/cover/7iaa_b.jpg",
312+
"studio": "マドンナ",
313+
"series": "",
314+
"tags": [
315+
"ハイビジョン",
316+
"独占配信",
317+
"デジモ",
318+
"熟女",
319+
"人妻",
320+
"巨乳",
321+
"職業色々",
322+
"痴女",
323+
"単体作品"
324+
],
325+
"stars": [
326+
{
327+
"name": "栗栖みなみ",
328+
"img": "https://pics.javbus.com/actress/v5u_a.jpg"
329+
}
330+
],
331+
"releaseDate": "2020-02-01",
332+
"screenshots": [
333+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-1.jpg",
334+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-2.jpg",
335+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-3.jpg",
336+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-4.jpg",
337+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-5.jpg",
338+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-6.jpg",
339+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-7.jpg",
340+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-8.jpg",
341+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-9.jpg",
342+
"https://pics.dmm.co.jp/digital/video/jul00133/jul00133jp-10.jpg"
343+
],
344+
"JAVID": "JUL-133"
292345
}
293346
]
294347
}

package-lock.json

Lines changed: 37 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
require('./handle/init')
2+
require('./pull/init')

src/handle/init.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
const _ = require('lodash')
2+
const fs = require('fs')
3+
const objHash = require('object-hash')
4+
const config = require('./../module/config')
5+
const qb = require('./../module/qbittorrent')
6+
const db = require('./../module/database')
7+
const ffmpeg = require('fluent-ffmpeg')
8+
const logger = require('./../module/logger')('Handle: Init')
9+
10+
const runAndSetInterval = async (fn, time) => {
11+
logger.debug(`[Check torrent status] Starting job`)
12+
try {
13+
await fn()
14+
} catch (error) {
15+
logger.error(`[Check torrent status] Job threw an error`, error)
16+
}
17+
logger.info(`[Check torrent status] Job finished, setting timer`)
18+
setTimeout(fn, time * 1000)
19+
}
20+
21+
runAndSetInterval(async () => {
22+
await process()
23+
}, 60)
24+
25+
const process = async () => {
26+
const torrentList = await qb.getTorrentList()
27+
28+
for (const i in torrentList) {
29+
const item = torrentList[i]
30+
const hash = item.hash
31+
32+
const JAVcontent = db.get('contents').find({ hash }).value()
33+
logger.debug('JAV torrent content', JAVcontent)
34+
35+
const JAVinfo = db.get('metadatas').find({ JAVID: JAVcontent.JAVID }).value()
36+
if (!JAVinfo) {
37+
logger.error(`[${JAVcontent.JAVID}] JAV info not found`)
38+
continue
39+
}
40+
41+
const torrentContent = await qb.getTorrentContent(hash)
42+
let videoFileInfo
43+
for (const index in torrentContent) {
44+
const file = torrentContent[index]
45+
46+
if (`${file.name}`.endsWith('.mp4')) {
47+
videoFileInfo = file
48+
break
49+
}
50+
}
51+
const filePath = config.get('system.savePath') + '/' + videoFileInfo.name
52+
53+
const videoMetadata = await new Promise((resolve, reject) => {
54+
ffmpeg.ffprobe(filePath, (error, metadata) => {
55+
if (error)
56+
{
57+
logger.error(error)
58+
reject(error)
59+
}
60+
61+
metadata = metadata['streams']
62+
const videoMetadata = {
63+
video: {
64+
width: metadata[0]['width'],
65+
height: metadata[0]['height'],
66+
codec: metadata[0]['codec_name'],
67+
duration: Math.round(metadata[0]['duration']),
68+
bitRate: metadata[0]['bit_rate'],
69+
fps: parseFloat(metadata[0]['nb_frames'] / metadata[0]['duration']).toFixed(2),
70+
},
71+
audio: {
72+
codec: metadata[1]['codec_name'],
73+
duration: Math.round(metadata[1]['duration']),
74+
bitRate: metadata[1]['bit_rate'],
75+
channels: metadata[1]['channels'],
76+
},
77+
}
78+
79+
resolve(videoMetadata)
80+
})
81+
})
82+
83+
const dotInfoFile = {
84+
version: 2,
85+
JAVID: JAVcontent.JAVID,
86+
videoMetadata: videoMetadata,
87+
JAVMetadata: JAVinfo,
88+
processTime: (new Date()).getTime(),
89+
hash: hash,
90+
episode: 'A'
91+
}
92+
93+
logger.debug('info.json content', dotInfoFile)
94+
95+
const fileHash = objHash(dotInfoFile)
96+
const dirName = __dirname + `/../../tmp/sync/${fileHash.substr(0, 2)}/` + `${fileHash.substr(-2, 2)}/` + `${fileHash}/`
97+
fs.mkdirSync(dirName, { recursive: true })
98+
fs.writeFileSync(dirName + 'info.json', JSON.stringify(dotInfoFile))
99+
100+
logger.debug(`Moving ${filePath} to ${dirName}video.mp4`)
101+
fs.renameSync(filePath, dirName + 'video.mp4')
102+
103+
logger.debug(`Deleting torrent ${hash}`)
104+
await qb.deleteTorrent(hash)
105+
106+
db.get('downloaded').push({ hash }).write()
107+
}
108+
}

src/module/database.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ const FileSync = require('lowdb/adapters/FileSync')
44
const adapter = new FileSync(__dirname + '/../../database/db.json')
55
const db = low(adapter)
66

7-
db.defaults({ contents: [], downloaded: [], processed: [] }).write()
7+
db.defaults({ contents: [], downloaded: [], processed: [], metadatas: [] }).write()
88

99
module.exports = db

src/module/javbus.js

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
const pRetry = require('p-retry')
2+
const parser = new (require('dom-parser'))()
3+
const logger = require('./logger')('Module: JAVBus')
4+
const fetch = require('node-fetch')
5+
6+
module.exports = async (JAVID) => {
7+
logger.debug('Request URL', 'https://www.javbus.com/ja/' + JAVID)
8+
const result = await pRetry(async () => {
9+
const res = await fetch('https://www.javbus.com/ja/' + JAVID, {
10+
headers: {
11+
'Cache-Control': 'max-age=0',
12+
Host: 'www.javbus.com',
13+
Referer: 'https://www.javbus.com',
14+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
15+
},
16+
timeout: 7000
17+
}).then((res) => res.text())
18+
19+
return res
20+
}, {
21+
onFailedAttempt: async (error) => {
22+
logger.error(`Attempt ${error.attemptNumber} failed. There are ${error.retriesLeft} retries left`)
23+
24+
return new Promise((resolve) => {
25+
setTimeout(() => {
26+
resolve()
27+
}, 20000)
28+
})
29+
},
30+
retries: 5
31+
})
32+
33+
logger.debug('Result length', result.length)
34+
35+
const dom = parser.parseFromString(result)
36+
37+
const data = {
38+
title: '',
39+
cover: '',
40+
studio: '',
41+
series: '',
42+
tags: [],
43+
stars: [],
44+
releaseDate: '',
45+
screenshots: []
46+
}
47+
48+
if (!dom.getElementsByClassName('info')[0]) {
49+
logger.debug('JAV not found')
50+
return
51+
}
52+
53+
const a = dom.getElementsByClassName('info')[0].getElementsByTagName('a')
54+
for (const i in a) {
55+
const item = a[i]
56+
const at = item.attributes
57+
for (const x in at) {
58+
const attr = at[x]
59+
if (attr.name === 'href') {
60+
const v = attr.value
61+
if (!data.studio && v.indexOf('/ja/studio/') !== -1) {
62+
logger.debug(JAVID, 'Got studio info', item.textContent)
63+
data.studio = item.textContent
64+
} else if (!data.series && v.indexOf('/ja/series/') !== -1) {
65+
logger.debug(JAVID, 'Got series info', item.textContent)
66+
data.series = item.textContent
67+
} else if (v.indexOf('/ja/genre/') !== -1) {
68+
logger.debug(JAVID, 'Got tag info', item.textContent)
69+
data.tags.push(item.textContent)
70+
}
71+
}
72+
}
73+
}
74+
75+
const imgs = dom.getElementsByClassName('movie')[0].getElementsByTagName('img')
76+
for (const i in imgs) {
77+
const item = imgs[i]
78+
const attrs = item.attributes
79+
if (attrs[0] && (attrs[0].value.indexOf('/actress/') !== -1 || attrs[0].value.indexOf('nowprinting') !== -1)) {
80+
logger.debug(JAVID, 'Got star name', attrs[1].value.trim())
81+
data.stars.push({
82+
name: attrs[1].value.trim(),
83+
img: attrs[0].value.trim()
84+
})
85+
} else if (attrs[0] && (attrs[0].value.indexOf('/cover/') !== -1 || attrs[0].value.indexOf('digital/video') !== -1)) {
86+
logger.debug(JAVID, 'Got JAV name', attrs[1].value)
87+
data.title = attrs[1].value
88+
logger.debug(JAVID, 'Got JAV cover', attrs[0].value)
89+
data.cover = attrs[0].value
90+
}
91+
}
92+
93+
const p = dom.getElementsByClassName('info')[0].getElementsByTagName('p')
94+
for (const i in p) {
95+
if (data.releaseDate) continue
96+
const item = p[i]
97+
if (item.firstChild && item.firstChild.textContent.indexOf('発売日:') !== -1) {
98+
logger.debug(JAVID, 'Got JAV release date', item.lastChild.textContent.trim())
99+
data.releaseDate = item.lastChild.textContent.trim()
100+
}
101+
}
102+
103+
const s = dom.getElementById('sample-waterfall').getElementsByTagName('a')
104+
for (const i in s) {
105+
const item = s[i]
106+
console.log(item.attributes)
107+
if (item.attributes[1]) data.screenshots.push(item.attributes[1].value)
108+
}
109+
110+
logger.debug(JAVID, data)
111+
112+
if (!data || !data.tags.length || !data.stars.length) {
113+
logger.warn('Invalid info for', data)
114+
return
115+
}
116+
117+
return data
118+
}

0 commit comments

Comments
 (0)