Skip to content

Instantly share code, notes, and snippets.

@kkotaro0111
Last active April 22, 2020 10:51
Show Gist options
  • Save kkotaro0111/3c210c8974b5eee7d9cc to your computer and use it in GitHub Desktop.
Save kkotaro0111/3c210c8974b5eee7d9cc to your computer and use it in GitHub Desktop.
Youtubeのオーディオライブラリに登録されている曲を全部ダウンロードするアレ
// モジュールロード
var http = require('http');
var request = require('request');
var fs = require('fs');
var EventEmitter = require('events').EventEmitter;
var domain = require('domain');
var d = domain.create();
d.on("error", function(err){
console.error("cws error", err);
ev.emit("done");
});
// URLを指定
var url = 'https://www.youtube.com/audioswap_ajax';
var dl_url = 'http://youtube-audio-library.storage.googleapis.com/';
//再帰用変数
var index = -1;
var len = 0;
//ストア
var tracks = [];
//JSON取得待ちカウント
var req_count = 3;
//JSON取得用クエリ設定
var query = {
action_get_tracks: 1,
q: "*",
ads: false,
dl: true,
s: "music",
mr: 1000,
si: 0,
qid: 1,
sh: false
};
var se_query1 = {
action_get_tracks: 1,
q: "*",
ads: false,
dl: true,
s: "soundeffects",
mr: 1000,
si: 0,
qid: 1,
sh: false
};
var se_query2 = {
action_get_tracks: 1,
q: "*",
ads: false,
dl: true,
s: "soundeffects",
mr: 1000,
si: 1000,
qid: 1,
sh: false
};
//イベント・ドリブン
var ev = new EventEmitter;
//ファイルを実際にダウンロードする処理
var download = function( id, filename, downloadable){
if( typeof downloadable === "boolean" && downloadable ){
console.log("Donwloading : ", filename );
var outFile = fs.createWriteStream( filename, { flags: "wx"});
outFile.on("error", function(err){
console.error("ERROR: FILE IS EXIST", filename);
outFile.close();
ev.emit("done");
});
outFile.on("open",function(){
var httpget = http.get( dl_url + id , function( mp3 ){
console.log("stream...");
// ダウンロードした内容をそのまま、ファイル書き出し。
mp3.pipe(outFile);
// 終わったらファイルストリームをクローズ。
mp3.on('end', function () {
outFile.close();
console.log("Donwloaded : ", filename );
//call event "next"
ev.emit("done");
});
});
});
}
};
var liteEscape = function(str){
var _str = str.replace(/ /g, "-").replace(/&/g, "and").replace(/\//g, "-");
return _str;
};
var next = function(){
index += 1;
if( index < len ){
var item = tracks[ index ];
var q = {};
if( item.genre ){
console.log("genre", item.genre);
q.id = liteEscape(item.reference_vid);
q.title = liteEscape(item.title);
q.genre = liteEscape(item.genre);
q.mood = liteEscape(item.mood);
q.downloadable = item.downloadable;
q.filename = "music/" + [q.genre, q.mood, q.title].join("_") + ".mp3";
}else if( item.category){
console.log("category", item.category);
q.id = liteEscape(item.vid);
q.title = liteEscape(item.title);
q.category = liteEscape(item.category);
q.downloadable = true;
q.filename = "se/" + [q.category, q.title].join("_") + ".mp3";
}
d.run(function(){
download( q.id, q.filename, q.downloadable );
});
}
};
var requestHandler = function(err, msg, res){
console.log("Donwloaded json", msg.request.uri.search);
var t = res.tracks;
Array.prototype.push.apply(tracks, t);
req_count -= 1;
if( req_count == 0 ){
len = tracks.length;
ev.emit("done");
}
};
var req1 = request.get(url, {
qs: query,
json: true
}, requestHandler);
var req2 = request.get(url, {
qs: se_query1,
json: true
}, requestHandler);
var req3 = request.get(url, {
qs: se_query2,
json: true
}, requestHandler);
ev.on("done", next);
@kkotaro0111
Copy link
Author

ディレクトリの自動生成したい

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment