Created
August 29, 2016 12:15
-
-
Save CertainLach/bd5b6cfba057b84d28f518cbaf43536e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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