From 6adac69a525f1c3adf976726fea1be6c2b50bf4b Mon Sep 17 00:00:00 2001 From: Lord-Protector Date: Wed, 17 May 2017 18:12:26 +0300 Subject: [PATCH] Some changes for personal bot with torrent-saving --- index.js | 286 +++++++++++++++++++++++++++++---------------------- package.json | 1 + push.js | 7 ++ 3 files changed, 170 insertions(+), 124 deletions(-) diff --git a/index.js b/index.js index 768886c..348d165 100644 --- a/index.js +++ b/index.js @@ -173,150 +173,188 @@ bot.onText(/^\/login/, function (msg) { }); }); -// Загружает нужные нам торрент-файлы и пакует их в ZIP для отправки адресату. -bot.onText(/^\/dl_(\d+)_(\d+)_(\d+)|^\/dl_(\d+)_(\d+)/, function (msg, match) { - let qs; - if (match[3] !== undefined) - qs = {c: match[1], s: match[2], e: match[3]}; - else - qs = {c: match[4], s: match[5], e: 999}; +global.download = function(from_id, serial, season, episode, torrentOnly) { + // Флаг для пользователей личного бота. + // Требуется, когда нужна загрузка определенного торрента, а не архива. + if (torrentOnly === undefined) + torrentOnly = false; + + return new Promise(function (resolve, reject) { + r.table('users') + .get(from_id) + + .then(function (res) { + if (res !== null && res.cookie !== undefined) { + return res; + } else + throw new Error('[/dl] User not authorized!'); + }) + + .then(function (res) { + const j = request.jar(); + const cookie = request.cookie(res.cookie); + const url = 'https://www.lostfilm.tv'; + j.setCookie(cookie, url); + + // Делаем запрос в некую поисковую систему LostFilm + // которая принимает три параметра: c, s, e (сериал, сезон, эпизод) + // и отправляет в ответ запрос на переадресацию + const options = { + url: 'https://lostfilm.tv/v_search.php', + jar: j, + qs: {c: serial, s: season, e: episode}, + transform: function (body) { + return cheerio.load(body); + } + }; - r.table('users') - .get(msg.from.id) + return request.get(options); + }) - .then(function (res) { - if (res !== null && res.cookie !== undefined) { - return res; - } else { - bot.sendMessage(msg.chat.id, 'Авторизуйтесь! /login'); - throw new Error('[/dl] User not authorized!'); - } - }) + .then(function ($) { + const options = { + url: $('body > a').attr('href'), + transform: function (body) { + return cheerio.load(body); + } + }; - .then(function (res) { - const j = request.jar(); - const cookie = request.cookie(res.cookie); - const url = 'https://www.lostfilm.tv'; - j.setCookie(cookie, url); + return request.get(options); + }) + + .then(function ($) { + // В перспективе нам может понадобиться usess-код, расположенный внизу + // любой страницы retre.org, поэтому парсим и сохраняем в базу "на всякий" + const usess = /- (.+) ;/.exec($('.footer-banner.left > a').attr('title'))[1]; + r.table('users') + .get(from_id) + .update({ + usess: usess + }); - // Делаем запрос в некую поисковую систему LostFilm - // которая принимает три параметра: c, s, e (сериал, сезон, эпизод) - // и отправляет в ответ запрос на переадресацию - const options = { - url: 'https://lostfilm.tv/v_search.php', - jar: j, - qs: qs, - transform: function (body) { - return cheerio.load(body) - } - }; + const item = $('.inner-box--item'); + + if (item.is('.inner-box--item')) { + // Создаем массив file, содержащий три объекта с качеством и ссылкой на загрузку + let files = []; + item + .each(function () { + //const quality = $(this).children('.inner-box--label').text().trim(); + const options = { + url: $('.inner-box--link.main > a', this).attr('href'), + encoding: null + }; + + files.push(request.get(options)); + }); + + return Promise.all(files); + } else + throw new Error('Incorrect codes for download!'); + }) + + .then(function (res) { + // Создаем архив ZIP + let archive = archiver('zip', { + zlib: { level: 9 } + }); - return request.get(options); - }) + let text = 'Магнет-ссылки:\n\n'; + for (let i in res) { + if (res.hasOwnProperty(i)) { + const buffer = Buffer.from(res[i], 'utf8'); + const torrent = parseTorrent(buffer); + + text += ('' + parseTorrent.toMagnetURI({ + name: torrent.name, + infoHash: torrent.infoHash, + announce: torrent.announce + }) + '\n\n'); + + // Чекаем наш флаг и существование конфигурации для личного бота + if (torrentOnly === true && config.private.download) { + const re = new RegExp(config.private.download.quality); + + // Регуляркой чекаем, какой нам нужно формат отдать в промайз + if (re.exec(torrent.name)) + resolve({ + magnet: text, + filename: `${torrent.name}.torrent`, + buffer: buffer + }); + } - .then(function ($) { - const options = { - url: $('body > a').attr('href'), - transform: function (body) { - return cheerio.load(body) + archive.append(buffer, {name: `${torrent.name}.torrent`}); + } } - }; - return request.get(options); - }) + // Завершаем компоновку архива + archive.finalize(); - .then(function ($) { - // В перспективе нам может понадобиться usess-код, расположенный внизу - // любой страницы retre.org, поэтому парсим и сохраняем в базу "на всякий" - const usess = /- (.+) ;/.exec($('.footer-banner.left > a').attr('title'))[1]; - r.table('users') - .get(msg.from.id) - .update({ - usess: usess + // Создаем временный массив temp для будущего Buffer + let temp = []; + archive.on('data', function (chunk) { + // Стримим содержимое архива пачками chunk в temp + temp.push(chunk); }); - const item = $('.inner-box--item'); - - if (item.is('.inner-box--item')) { - // Создаем массив file, содержащий три объекта с качеством и ссылкой на загрузку - let files = []; - item - .each(function () { - //const quality = $(this).children('.inner-box--label').text().trim(); - const options = { - url: $('.inner-box--link.main > a', this).attr('href'), - encoding: null - }; - - files.push(request.get(options)); - }); - - return Promise.all(files); - } else - throw new Error('Incorrect codes for download!'); - }) - - .then(function (res) { - // Создаем архив ZIP - let archive = archiver('zip', { - zlib: { level: 9 } - }); - - let text = 'Магнет-ссылки:\n\n'; - for (let i in res) { - if (res.hasOwnProperty(i)) { - const buffer = Buffer.from(res[i], 'utf8'); - const torrent = parseTorrent(buffer); - - text += ('' + parseTorrent.toMagnetURI({ - name: torrent.name, - infoHash: torrent.infoHash, - announce: torrent.announce - }) + '\n\n'); - - archive.append(buffer, {name: `${torrent.name}.torrent`}); - } - } - - // Завершаем компоновку архива - archive.finalize(); + archive.on('error', function (error) { + throw new Error(error); + }); - // Создаем временный массив temp для будущего Buffer - let temp = []; - archive.on('data', function (chunk) { - // Стримим содержимое архива пачками chunk в temp - temp.push(chunk); - }); + // По завершению стрима собираем Buffer + archive.on('end', function () { + const buffer = Buffer.concat(temp); + r.table('serials') + .get(serial) + + .then(function(res) { + let filename = ''; + if (episode === 999) + filename = `${res.alias}_S${season}`; + else + filename = `${res.alias}_S${season}E${episode}`; + + resolve({ + magnet: text, + filename: filename, + buffer: buffer + }); + }) + + .catch(function (error) { + throw new Error(error); + }) + }); + }) - archive.on('error', function (error) { - throw new Error(error); + .catch(function (error) { + reject(error); }); + }); +}; - // По завершению стрима собираем Buffer - archive.on('end', function () { - const buffer = Buffer.concat(temp); - console.log(buffer); - - r.table('serials') - .get(parseInt(match[1] || match[4])) - - .then(function (res) { - // Собираем название архива и отправляем Buffer Телеграму - const fileName = `${res.alias}_s${match[2] || match[5]}e${match[3]|| 'All'}.zip`; - bot.sendMessage(msg.chat.id, text, parse_html); - bot.sendDocument(msg.chat.id, buffer, {}, fileName); - }) +// Загружает нужные нам торрент-файлы и пакует их в ZIP для отправки адресату. +bot.onText(/^\/dl_(\d+)_(\d+)_(\d+)|^\/dl_(\d+)_(\d+)/, function (msg, match) { + let serial, season, episode; + if (match[3] !== undefined) { + serial = parseInt(match[1]); + season = parseInt(match[2]); + episode = parseInt(match[3]); + } else { + serial = parseInt(match[4]); + season = parseInt(match[5]); + episode = 999; + } - .catch(function (error) { - throw new Error(error); - }); - }); + download(msg.from.id, serial, season, episode) + .then(function (res) { + bot.sendDocument(msg.chat.id, res.buffer, {}, res.filename); }) .catch(function (error) { console.warn(error.message); - bot.sendMessage(msg.chat.id, 'Что-то пошло не так...'); - }); + }) }); // Отмечает серию или сезон, как Просмотренный (или наоборот) через API Lostfilm. diff --git a/package.json b/package.json index 56eaf1e..952c864 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "cheerio": "^0.22.0", "console-stamp": "^0.2.5", "feedparser": "^2.2.0", + "fs": "0.0.1-security", "node-telegram-bot-api": "^0.27.1", "parse-torrent": "^5.8.3", "ramda": "^0.23.0", diff --git a/push.js b/push.js index b2cf6ee..2952c2e 100644 --- a/push.js +++ b/push.js @@ -3,6 +3,7 @@ */ const stream = require('stream'); const FeedParser = require('feedparser'); +const fs = require('fs'); function hashCode(str){ let hash = 0; @@ -159,6 +160,12 @@ module.exports = function () { 'Полностью вышел ' + res.new.season + ' сезон.\n' + 'Загрузить: /dl_' + res.serial + '_' + res.new.season; + // Сохраняем файл для пользователей личного бота + if (res.users[i].id === config.private.download.id) { + const file = await download(res.users[i].id, res.serial, res.new.season, res.new.episode, true); + fs.writeFileSync(`torrents/${file.filename}`, file.buffer); + } + console.log(await bot.sendMessage(res.users[i].id, text, parse_html)); } }