Skip to content

Instantly share code, notes, and snippets.

@CertainLach
Created August 29, 2016 12:15
Show Gist options
  • Save CertainLach/bd5b6cfba057b84d28f518cbaf43536e to your computer and use it in GitHub Desktop.
Save CertainLach/bd5b6cfba057b84d28f518cbaf43536e to your computer and use it in GitHub Desktop.
const COLLECTION_DIR = 'путь до папки с музыкой без / в конце';
const VK_TOKEN = 'токен';
const THREADS=4;
const url = require("url");
const http = require("http");
const https = require("https");
const fs = require("fs");
let canReceive = true;
function contains(str,sub) {
return !!(str.indexOf(sub)+1);
}
function updateCollection() {
if (!canReceive)
return;
canReceive = false;
console.log('Updating collection...');
let url='https://api.vk.com/method/audio.get?need_user=0&count=6000&access_token='+VK_TOKEN+'&version=5.53';
get(url).then(res => {
let files=fs.readdirSync(COLLECTION_DIR);
res=res.filter(r=>r.title&&r.artist&&r.url&&!contains(r.title,'-')&&!contains(r.artist,'-')&&!contains(r.title,'/')&&!contains(r.artist,'/'));
res=res.filter(r=>!contains(files,`${r.artist} - ${r.title}.mp3`));
console.log('Got '+res.length+' songs');
res=res.slice(-THREADS);
console.log('Downloading '+res.length);
let tasks=[];
res.forEach(r=>{
tasks.push(saveToFile(r.url,COLLECTION_DIR+'/'+`${r.artist} - ${r.title}.mp3`));
});
Promise.all(tasks).then(()=>{
canReceive=true;
console.log('Done');
});
});
}
setInterval(() => updateCollection(), 1000);
function saveToFile(link, filename) {
return new Promise((res, rej) => {
var file = fs.createWriteStream(filename);
https.get(link, function(response) {
console.log('Downloading '+filename);
response.pipe(file);
response.on('end', () => {
console.log('Downloaded '+filename);
res();
});
});
});
}
function get(link) {
return new Promise((resolve, reject) => {
let getter;
switch (url.parse(link).protocol) {
case 'http:':
getter = http;
break;
case 'https:':
getter = https;
break;
default:
throw 'Unknown protocol';
}
getter.get(link, (res) => {
let data = '';
res.on('data', d => {
data += d.toString();
});
res.on('end', () => {
try {
data = JSON.parse(data);
if (data.response) {
data = data.response;
}
if (data.error) {
reject(data.error);
}
resolve(data);
}
catch (e) {
resolve(data);
}
});
res.on('error', err => {
reject(err);
});
}).on('error', err => {
reject(err);
});
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment