// ==UserScript== // @name YouTubeとニコニコ動画にRSSリンクを追加 // @description YouTube:ユーザー、マイリスト、チャンネル ニコニコ動画:ユーザー、マイリスト、タグ // @version 0.1 // @run-at document-idle // @match *://www.youtube.com/playlist?list=* // @match *://www.youtube.com/channel/* // @match *://www.youtube.com/user/* // @match *://www.nicovideo.jp/user/* // @match *://www.nicovideo.jp/mylist/* // @match *://www.nicovideo.jp/tag/* // @match *://www.nicovideo.jp/related_tag/* // @match *://www.nicovideo.jp/search/* // @match *://www.nicovideo.jp/watch/* // @match *://www.nicovideo.jp/mylist_search/* // @grant none // @namespace https://greasyfork.org/users/181558 // @downloadURL none // ==/UserScript== (function() { var rssICON = ''; setTimeout(addLinks, 200); //ページ継ぎ足しアドオンに対応 if (location.href.match(/related_tag|mylist_search/)) document.addEventListener("AutoPagerize_DOMNodeInserted", addLinks); //AutoPagerize系アドオンでuserやタグページを継ぎ足した時に2ページ目以降のリンクがおかしくなるのを修正 //user if (location.href.match(/www.nicovideo.jp\/user/)) document.addEventListener("AutoPagerize_DOMNodeInserted", function() { for (let ele of elegeta("//div[@class='section']/h5/a[contains(@href,'http://www.nicovideo.jp/user/')]")) ele.href = "http://www.nicovideo.jp/watch/" + ele.href.replace(/https?:\/\/www.nicovideo.jp\/user\/\d*\/watch\//, ""); }); //related_tag if (location.href.match(/www.nicovideo.jp\/related_tag/)) document.addEventListener("AutoPagerize_DOMNodeInserted", function() { for (let ele of elegeta("//a[contains(@href,'http://www.nicovideo.jp/related_tag/tag/')]")) ele.href = "http://www.nicovideo.jp/tag/" + ele.href.replace(/https?:\/\/www.nicovideo.jp\/related_tag\/tag\//, ""); }); return; //実際にリンクを付ける function addLinks() { //「新しいタブで開く」指定を外す for (let ele of elegeta('//a[@target="_blank"]')) ele.removeAttribute("target"); //前回つけたリンクがあれば除去 for (let ele of elegeta("//span[@class='multirss']|//a[@class='multirss']")) ele.parentNode.removeChild(ele); addRSSlink("://www.youtube.com/playlist?list=", '//a[@class="yt-simple-endpoint style-scope yt-formatted-string"]', '*RSS Feed*', "list="); addRSSlink("://www.youtube.com/channel/", '//span[@id="channel-title"]', '*RSS Feed*', "channel/"); addRSSlink("://www.youtube.com/user/", '//span[@id="channel-title"]', '*RSS Feed*', "user/"); var nicodeleteOpt = /[\?&]f_range=.|[\?&]l_range=.|[\?&]opt_md=.*|[\?&]start=.*|[\?&]end=.*|[\?&]ref=[^&]*|[\?&]sort=.|[\?&]order=.|[\?&]page=\d*|[\?&]track=[^&]*|#+.*/g; addRSSlink("www.nicovideo.jp/user/", '//div[@class="profile"]', '*RSS Feed*', "/user/", "", nicodeleteOpt); addRSSlink("www.nicovideo.jp/mylist/", '//div[@id="SYS_box_mylist_header"]/div/h1', '*RSS Feed*', "", "?rss=2.0", nicodeleteOpt); addRSSlink("www.nicovideo.jp/tag/", '//header[@class="contentHeader"]/h1/span', '*RSS Feed*', "", "?sort=f&rss=2.0", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/related_tag/", '//table[@class="font12"]/tbody/tr/td/a', '*RSS Feed*', "", "", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/search", "//ul[@class='tags']//a", '*RSS Feed*', "", "", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/tag", "//ul[@class='tags']//a", '*RSS Feed*', "", "", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/watch/", '//a[@class="Link TagItem-name"]', '*RSS Feed*', "", "", nicodeleteOpt); if (/www.nicovideo.jp\/mylist_search\//.exec(location.href)) for (let ele of elegeta('//div/div/div/div/div/div/p/a')) addRSS(ele, ele.href + "?rss=2.0", ele.innerText); return; } function eleget0(xpath) { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); return ele.snapshotLength > 0 ? ele.snapshotItem(0) : ""; } function elegeta(xpath) { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var array = []; for (var i = 0; i < ele.snapshotLength; i++) array[i] = ele.snapshotItem(i); return array; } function addRSSlink(inurl, xpath, newurl, part, after, urlGarbage = /$^/) { if (location.href.indexOf(inurl) == -1) return var ele = eleget0(xpath); var text = newurl + location.href.split(part)[1]; var url = location.href.replace(urlGarbage, ""); var link = document.createElement("span"); var url2 = after ? ('*RSS Feed*') : newurl.replace("***", location.href.split(part)[1].match(/[^\?&\/]*/g)[0]); var bgcol = "background-color:#c9e9ff;"; link.setAttribute("title", ele.innerText + "のRSSを購読"); link.setAttribute("class", "multirss"); url2 = url2.replace("*RSS Feed*", rssICON) link.innerHTML = url2; ele.parentNode.appendChild(link); return; } function addRSSlink2(inurl, xpath, newurl, part, after, urlGarbage = /$^/) { if (location.href.indexOf(inurl) == -1) return for (let ele of elegeta(xpath)) { var url = location.href.replace(urlGarbage, ""); var link = document.createElement("span"); var url2 = newurl.replace("***", encodeURIComponent(ele.innerText)); var bgcol = "background-color:#c9e9ff;"; url2 = url2.replace("*RSS Feed*", rssICON) link.setAttribute("title", ele.innerText + "のRSSを購読"); link.setAttribute("class", "multirss"); link.innerHTML = url2; ele.parentNode.insertBefore(link, ele); } return; } function addRSS(place, url, title) { var link = place.parentNode.insertBefore(document.createElement("a"), place); link.href = url; link.setAttribute("title", title + "のRSSを購読"); link.setAttribute("class", "multirss"); link.innerHTML = rssICON; } })();