Skip to content

Instantly share code, notes, and snippets.

@asannou
Last active September 11, 2017 05:04
Show Gist options
  • Save asannou/7352f2d01342948263de81bad7e1fe53 to your computer and use it in GitHub Desktop.
Save asannou/7352f2d01342948263de81bad7e1fe53 to your computer and use it in GitHub Desktop.
分裂したニコニコ実況をマージ
#!/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();
@asannou
Copy link
Author

asannou commented Sep 10, 2017

hosts ファイル(Windows の場合 c:¥windows¥system32¥drivers¥etc¥hosts など)に以下の行を追記

jk.nicovideo.jp 52.199.26.3

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