Last active
September 11, 2017 05:04
-
-
Save asannou/7352f2d01342948263de81bad7e1fe53 to your computer and use it in GitHub Desktop.
分裂したニコニコ実況をマージ
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
#!/usr/bin/env node | |
"use strict"; | |
// jk.nicovideo.jp 52.199.26.3 | |
/* | |
server { | |
listen 80; | |
server_name jk.nicovideo.jp; | |
location / { | |
proxy_pass http://jk.nicovideo.jp; | |
proxy_set_header Host $http_host; | |
} | |
location = /api/v2/getflv { | |
proxy_pass http://jk.nicovideo.jp; | |
proxy_set_header Host $http_host; | |
sub_filter "ms=202.219.109.198" "ms=52.199.26.3"; | |
sub_filter "ms=202.219.109.199" "ms=52.199.26.3"; | |
sub_filter "ms=202.219.109.200" "ms=52.199.26.3"; | |
sub_filter "ms_port=2526" "ms_port=2525"; | |
sub_filter "ms_port=2527" "ms_port=2525"; | |
sub_filter_once on; | |
} | |
} | |
*/ | |
const threads = [1504810802, 1504897201, 1504983602, 1505070336]; | |
const streams = {}; | |
class SafetyValve extends require("stream").PassThrough { | |
constructor() { | |
super(); | |
} | |
pause() { | |
this.unpipe().resume(); | |
console.error("unpipe"); | |
} | |
} | |
const createServer = () => { | |
const net = require("net"); | |
const server = net.createServer(socket => { | |
console.error(`c:connect ${socket.localPort} ${socket.remoteAddress}`); | |
let stream; | |
const valve = new SafetyValve(); | |
socket.on("data", data => { | |
data = data.toString(); | |
console.error(`c:data ${socket.remoteAddress} ${data}`); | |
const thread = data.match(/thread="([\d]+)"/); | |
if (thread) { | |
stream = streams[thread[1]]; | |
if (stream) { | |
stream.pipe(valve).pipe(socket); | |
} else { | |
console.error("stream not found"); | |
} | |
} | |
}); | |
socket.on("close", () => { | |
console.error(`c:close ${socket.remoteAddress}`); | |
if (stream) { | |
stream.unpipe(valve).resume(); | |
} | |
}); | |
socket.on("error", err => console.error(`c:error ${socket.remoteAddress}`) && console.error(err)); | |
}); | |
server.listen(2525); | |
console.error(`s:listen 2525`); | |
}; | |
const createStream = (host, port, thread) => { | |
const client = require("net").connect({ host: host, port: port }, () => { | |
console.error(`ms:connect ${thread}`); | |
//client.on("data", () => console.error(`ms:data ${thread}`)); | |
client.on("close", () => console.error(`ms:close ${thread}`)); | |
client.on("end", () => console.error(`ms:end ${thread}`)); | |
client.on("error", err => console.error(`ms:error ${thread}`) && console.error(err)); | |
client.write(`<thread res_from="0" version="20061206" thread="${thread}" />\0`); | |
}); | |
return client; | |
}; | |
const connect = channel => { | |
require("http").request({ | |
host: "jk.nicovideo.jp", | |
path: "/api/v2/getflv?v=jk" + channel | |
}, res => { | |
res.on("data", chunk => { | |
const query = require("querystring").parse(chunk.toString()); | |
const offset = threads.map(t => { return query.thread_id - t }).find(o => { return 0 <= o && o < 100; }); | |
const merged = new require("stream").PassThrough(); | |
threads.forEach(t => { | |
const stream = createStream(query.ms, query.ms_port, t + offset); | |
stream.pipe(merged).resume(); | |
streams[t + offset] = merged; | |
}); | |
}); | |
}).end(); | |
}; | |
connect(1); | |
connect(2); | |
connect(4); | |
connect(5); | |
connect(6); | |
connect(7); | |
connect(8); | |
connect(9); | |
connect(10); | |
connect(11); | |
connect(12); | |
connect(101); | |
connect(103); | |
connect(141); | |
connect(151); | |
connect(161); | |
connect(171); | |
connect(181); | |
connect(211); | |
connect(222); | |
createServer(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
hosts ファイル(Windows の場合 c:¥windows¥system32¥drivers¥etc¥hosts など)に以下の行を追記