[nodeJS] requestjs in Schleife
Hey,
ich versuche seit zwei Tagen irgendwie mein kleines Nodejs Programm zum laufen zu bekommen.
Ziel ist mit Hilfe von youtube-dl (Python) einer Menge Proxies und requests JS erstmal 1000 "Videos" von Streamcloud zu saugen.
Meine Applikation beginnt mit dem Import der benötigten Libs
Code:
var fs = require('fs');
fs.debug = true;
const request = require('request');
request.debug = true;
var glob = require("glob");
//const { spawn } = require('child_process');
var spawn = require('child_process').spawnSync;
const url = require('url');
var getSlug = require('speakingurl');
var path = require('path');
var async = require("async");
gefolgt vom laden der proxies aus einer text datei
Code:
var proxies = [];
var proxyList = fs.readFileSync('proxies.txt', 'utf8');
proxyList.split(/\r?\n/).forEach(function(proxy){
let $proxy = {};
$proxy = proxy.replace('name', 'SuperVIP*****');
$proxy = $proxy.replace('pass', 'Df****');
proxies.push($proxy);
});
Es folgt eine einfache Funktion die mir einen Proxie zurückgibt
Code:
function proxy(){
return proxies.shift();
}
Es folgt die Funktion download die den direkt download link ermittelt und den download durchführt
Code:
function download(link, savepath){
$proxy = proxy();
var child = spawn('youtube-dl' , ['-g', "--proxy", $proxy, link]);
console.log('stdout here: \n' + child.stdout);
console.log('stderr here: \n' + child.stderr);
$output = child.stdout.toString().replace(/\s/g, '');
if(url.parse($output)){
//request.defaults({'proxy': $proxy});
let r = request({
'url': $output,
'proxy': $proxy,
'rejectUnauthorized': false
});
r.on('error', function(err) {
console.log(err)
})
r.on('response', function (res) {
console.log(savepath+path.extname($output));
res.pipe(fs.createWriteStream(savepath+path.extname($output),{flags: 'w+'}));
});
r.end();
/*
var file = fs.createWriteStream(savepath+path.extname($output), {flags:'w+',mode: 0666});
file.on('error', function(err){
console.log(err);
});
request
.get($output)
.on('error', function(err) {
console.log(err)
})
.on('data', function(chunk){
file.write(chunk);
})
.on('end', function(){
file.close();
})
.end();
*/
return savepath+path.extname($output);
}
}
Diese Funktion funktionierte (in irgend einer Version) mal, aber nur wenn man den Download einzeln durchführte.
Ich hatte es irgendwann am Tag mal so probiert
Code:
glob("input/*.json", function(err, files) {
if(err) {
console.log("cannot read the folder, something goes wrong with glob", err);
}
files.forEach(function(file){
var entity = JSON.parse(fs.readFileSync(file, 'utf8'));
entity.paths = [];
if(entity.links['streamcloud.eu'].length == 1){
$savepath = path.resolve(__dirname, 'storage/'+getSlug(entity.title, {lang: 'de'}));
$path = download(entity.links['streamcloud.eu'][0], $savepath);
entity.paths.push($path);
}
fs.writeFileSync(file.replace('input', 'output'), JSON.stringify(entity), 'utf8');
});
});
Jetzt bin ich soweit das mir bekannt ist das requestjs in einer Schleife nicht funktioniert. Irgendwas mit Sockets oder so.
Gut gibt ja async.js
Code:
var q = [];
glob("input/*.json", function(err, files) {
if(err) {
console.log("cannot read the folder, something goes wrong with glob", err);
}
files.forEach(function(file){
var entity = JSON.parse(fs.readFileSync(file, 'utf8'));
entity.paths = [];
entity.path = file;
entity.download = {path: ''};
if(entity.links['streamcloud.eu'].length == 1){
entity.download.path = path.resolve(__dirname, 'storage/'+getSlug(entity.title, {lang: 'de'})+'.mp4');
//console.log(entity.download.path);
entity.url = entity.links['streamcloud.eu'][0];
//$path = download(entity.links['streamcloud.eu'][0], $savepath);
//entity.paths.push($path);
fs.writeFileSync(file.replace('input', 'output'), JSON.stringify(entity), 'utf8');
q.push(requestApi(entity));
}
});
});
Code:
var requestApi = function(data, next){
console.log('job triggered');
$proxy = proxy();
var child = spawn('youtube-dl' , ['-g', "--proxy", $proxy, data.url]);
console.log('stdout here: \n' + child.stdout);
console.log('stderr here: \n' + child.stderr);
$output = child.stdout.toString().replace(/\s/g, '');
if(!url.parse($output)){
next();
}
request.defaults({'proxy': $proxy});
var file = fs.createWriteStream(data.download.path, {flags:'w+',mode: 0666});
request
.get($output)
.on('error', function(err) {
console.log(err);
next(err);
})
.on('data', function(chunk){
file.writeSync(chunk);
})
.on('end', function(){
file.close();
next();
})
.end();
};
Code:
async.series(q, function(err, data){
console.log(err);
});
Der Part DDL ermitteln funktioniert
Code:
stderr here:
REQUEST { uri: 'http://stor8.streamcloud.eu:8080/5hv75o2easoax3ptxzjijq77vum52hf
wnab4mmoq6rbxvjtmwc3a4g36r4/video.mp4',
method: 'GET',
callback: undefined }
REQUEST make request http://stor8.streamcloud.eu:8080/5hv75o2easoax3ptxzjijq77vu
m52hfwnab4mmoq6rbxvjtmwc3a4g36r4/video.mp4
job triggered
^C
C:\src\downloader>
Request wird auch gefeuert aber es wird nicht geladen.
Hat jemand irgendwie Vorschläge.
Ziel. Den Downloader zum laufen bekommen.
Btw. Wieso kann man bei streamcloud nicht einfach fremdlinks importieren wie bei openload?