Last active
April 22, 2020 10:51
-
-
Save kkotaro0111/3c210c8974b5eee7d9cc to your computer and use it in GitHub Desktop.
Youtubeのオーディオライブラリに登録されている曲を全部ダウンロードするアレ
This file contains 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
// モジュールロード | |
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); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
途中でやり直した時、ファイルが既に存在してたらダウンロードしないようにした。