YouTube AutoPager
YouTube用のAutoPager。多分どこかにあるんだろけど適当に作ってみた。
Firefox+GreasemonkeyとOperaの両方で動くはず。
ちなみにscroll_remainが場合分けしているのは標準モードとかそのへんで document.body.scrollHeight あたりが変わるらしいから。最初気づかず、Firefoxで試したときにはまった。
// ==UserScript== // @name YouTube AutoPager // @include http://*.youtube.com/* // ==/UserScript== (function(){ var base = "http://" + location.host; var nextPage; var appendPage = function(path, f) { var req; var url = base + path; try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { req = new XMLHttpRequest(); } req.onreadystatechange = function() { if (req.readyState != 4) return; var v = req.responseText; var start = v.indexOf('<div id="mainContent">'); var end = v.indexOf('<div id="footerDiv">'); var div = v.substr(start, end - start); div = div.replace(/^<[^>]+>/, ""); div = div.replace(/<\/div>\s+$/, ""); nextPage = getNextPage(div); var content = document.getElementById("mainContent"); content.innerHTML += div; window.status = "loading " + url + " done"; f(); }; req.open("GET", url, true); window.status = "loading " + url; req.send(null); }; var getNextPage = function(html) { var lines = html.split("\n"); var page = null; for (var i = lines.length - 1; i >= 0; i--) { if (lines[i].match(/location\.href='(.*)'/)) { var page_tmp = RegExp.$1; if (lines[i].match(/Next/)) { page = page_tmp; } else { page = null; } break; } } return page; } var do_request = function(f) { var lines = document.getElementById("mainContent").innerHTML.split("\n"); if (nextPage) { appendPage(nextPage, f); } }; var scroll_remain; if (window.opera) { scroll_remain = function() { var sc = document.body.scrollTop; var total = document.body.scrollHeight - document.body.clientHeight; return total - sc; } } else { scroll_remain = function() { var sc = document.documentElement.scrollTop; var total = document.documentElement.scrollHeight - document.documentElement.clientHeight; return total - sc; } } var watch_scroll = function() { var self = arguments.callee; var next = function() { setTimeout(self, 200); }; var remain = scroll_remain(); if (remain < 1000) { do_request(next); } else if (nextPage) { next(); } }; var mainContent = document.getElementById("mainContent").innerHTML; nextPage = getNextPage(mainContent); watch_scroll(); })();