// ==UserScript== // @name ニコニコ除ニコレポEx // @namespace https://greasyfork.org/users/175598 // @description ニコレポをフィルタリングします // @match http://www.nicovideo.jp/my/top // @match http://www.nicovideo.jp/my/top/* // @match http://www.nicovideo.jp/user/* // @grant none // @author Original by Fushihara,Modded by Boyu // @license CC0 public domain // @version 2018.03.20.2 // @downloadURL none // ==/UserScript== // Original by Fushihara:https://github.com/fushihara/nico-repo (function(){ var localStorageKey="niconicoRemoveNicorepo_modBoyu"; // cssに付ける接頭語 var classPrefix="niconicoRemoveNicorepo_modBoyu"; //切り替え出来る要素 var contents=[]; // バージョン数 var nowVersion = 180320; //userType:1=ユーザーが 2=コミュニティが 3=チャンネルが var contentsAdd=function({contentId,buttonLabel,userType,normalizeText}){ // contentIdが重複してる場合はアラートを出す let qequalIdContents = contents.filter((content)=>{ return content.contentId === contentId; }); if( 0 < qequalIdContents.length){ alert(`contentsIdが重複しています ${contentId}`); } contents.push({ "contentId" :contentId, "userType" :userType, "buttonLabel" :buttonLabel, "normalizeText":normalizeText }); }; //追加出来るかどうか //参考:http://nicovideo.cdn.nimg.jp/uni/scripts/pages/my/nicorepo/message/ja-jp.js var init=function(){ var initState; load(); contentsAdd({contentId:"user-video-add" ,userType:1,buttonLabel:"動画を投稿"            ,normalizeText:"[LINK USER]さんが動画を投稿しました。"}); contentsAdd({contentId:"user-video-played" ,userType:1,buttonLabel:"再生数達成"            ,normalizeText:"[LINK USER]さんの動画が[NUMBER]再生を達成しました。"}); contentsAdd({contentId:"user-video-rank" ,userType:1,buttonLabel:"ランキング達成"          ,normalizeText:"[LINK USER]さんの動画が[NUMBER]位を達成しました。"}); contentsAdd({contentId:"user-video-live-ad" ,userType:1,buttonLabel:"生放送で紹介"           ,normalizeText:"[LINK USER]さんの動画が 生放送[LINK LIVE]で紹介されました。"}); contentsAdd({contentId:"user-video-added" ,userType:1,buttonLabel:"広告された"            ,normalizeText:"[LINK USER]さんの動画が[LINK USER]さんにニコニ広告されました。[LINK NICOAD]"}); contentsAdd({contentId:"user-video-ad" ,userType:1,buttonLabel:"広告した"             ,normalizeText:"[LINK USER]さんがニコニ広告しました。[LINK NICOAD]"}); contentsAdd({contentId:"user-comm-video-add" ,userType:1,buttonLabel:"コミュニティ専用動画を投稿"    ,normalizeText:"[LINK USER]さんがコミュニティ専用動画を投稿しました。"}); contentsAdd({contentId:"user-seiga-add" ,userType:1,buttonLabel:"イラストを投稿"          ,normalizeText:"[LINK USER]さんがイラストを投稿しました。"}); contentsAdd({contentId:"user-seiga-fav" ,userType:1,buttonLabel:"イラストをクリップ"        ,normalizeText:"[LINK USER]さんが イラストをクリップしました。"}); contentsAdd({contentId:"user-manga-add" ,userType:1,buttonLabel:"マンガを投稿"           ,normalizeText:"[LINK USER]さんがマンガ[LINK MANGA]を投稿しました。"}); contentsAdd({contentId:"user-manga-fav" ,userType:1,buttonLabel:"マンガをお気に入り登録"      ,normalizeText:"[LINK USER]さんがマンガをお気に入りしました。"}); contentsAdd({contentId:"user-game-add" ,userType:1,buttonLabel:"ゲームを投稿"           ,normalizeText:"[LINK USER]さんがゲームを投稿しました。"}); contentsAdd({contentId:"user-game-update" ,userType:1,buttonLabel:"ゲームを更新"           ,normalizeText:"[LINK USER]さんがゲームを更新しました。"}); contentsAdd({contentId:"user-blog-add" ,userType:1,buttonLabel:"記事を投稿"            ,normalizeText:"[LINK USER]さんが記事を投稿しました。"}); contentsAdd({contentId:"user-solid-add" ,userType:1,buttonLabel:"立体を投稿"            ,normalizeText:"[LINK USER]さんが立体を投稿しました。"}); contentsAdd({contentId:"user-solid-open" ,userType:1,buttonLabel:"立体の配布データを公開"      ,normalizeText:"[LINK USER]さんが立体の配布データを公開しました。"}); contentsAdd({contentId:"user-solid-update" ,userType:1,buttonLabel:"立体の配布データを更新"      ,normalizeText:"[LINK USER]さんが立体の配布データを更新しました。"}); contentsAdd({contentId:"user-solid-fav" ,userType:1,buttonLabel:"立体をお気に入り登録"       ,normalizeText:"[LINK USER]さんが立体をお気に入り登録しました。"}); contentsAdd({contentId:"user-know-add" ,userType:1,buttonLabel:"ナレッジを投稿"          ,normalizeText:"[LINK USER]さんが ナレッジを投稿しました。"}); contentsAdd({contentId:"user-app-add" ,userType:1,buttonLabel:"アプリを開始"           ,normalizeText:"[LINK USER]さんが アプリを遊びはじめました。"}); contentsAdd({contentId:"user-stamp-get" ,userType:1,buttonLabel:"スタンプを取得"          ,normalizeText:"[LINK USER]さんがスタンプを取得しました。"}); contentsAdd({contentId:"user-fav" ,userType:1,buttonLabel:"あなたをフォロー"         ,normalizeText:"あなたを[LINK USER]さんがフォローしました。"}); contentsAdd({contentId:"user-list-fav" ,userType:1,buttonLabel:"あなたのマイリストをフォロー"   ,normalizeText:"あなたの マイリスト[LINK MYLIST]を[LINK USER]さんがフォローしました。"}); contentsAdd({contentId:"user-list-video-add" ,userType:1,buttonLabel:"動画をマイリスト登録"       ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]に動画を登録しました。"}); contentsAdd({contentId:"user-list-manga-add" ,userType:1,buttonLabel:"マンガをマイリスト登録"      ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]にマンガ[LINK MANGA]を登録しました。"}); contentsAdd({contentId:"user-list-book-add" ,userType:1,buttonLabel:"書籍をマイリスト登録"       ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]に書籍を登録しました。"}); contentsAdd({contentId:"user-list-blog-add" ,userType:1,buttonLabel:"ブロマガをマイリスト登録"     ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]にブロマガを登録しました。"}); contentsAdd({contentId:"user-temp-video-add" ,userType:1,buttonLabel:"動画をとりあえずマイリスト登録"  ,normalizeText:"[LINK USER]さんが とりあえずマイリスト に動画を登録しました。"}); contentsAdd({contentId:"user-temp-manga-add" ,userType:1,buttonLabel:"マンガをとりあえずマイリスト登録" ,normalizeText:"[LINK USER]さんが とりあえずマイリスト にマンガ[LINK MANGA]を登録しました。"}); contentsAdd({contentId:"user-temp-book-add" ,userType:1,buttonLabel:"書籍をとりあえずマイリスト登録"  ,normalizeText:"[LINK USER]さんが とりあえずマイリスト に書籍を登録しました。"}); contentsAdd({contentId:"user-temp-blog-add" ,userType:1,buttonLabel:"ブロマガをとりあえずマイリスト登録",normalizeText:"[LINK USER]さんが とりあえずマイリスト にブロマガを登録しました。"}); //contentsAdd({contentId:"user-live-cas-onairs" ,userType:1,buttonLabel:"nicocasを開始"           ,normalizeText:"[LINK USER]さんが nicocas番組を開始しました。"}); //contentsAdd({contentId:"user-video-ad-old" ,userType:1,buttonLabel:"広告した(旧式)"          ,normalizeText:"[LINK USER]さんが ニコニ広告で宣伝しました。[LINK UAD]"}); //contentsAdd({contentId:"user-video-added-old" ,userType:1,buttonLabel:"広告された(旧式)"         ,normalizeText:"[LINK USER]さんの動画が[LINK USER]さんにニコニ広告で宣伝されました。[LINK UAD]"}); contentsAdd({contentId:"comm-live-onairs" ,userType:2,buttonLabel:"生放送を開始"           ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]で生放送を開始しました。"}); contentsAdd({contentId:"comm-live-reserve" ,userType:2,buttonLabel:"生放送を予約"           ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]で[DATE]に生放送を予約しました。"}); contentsAdd({contentId:"comm-level-up" ,userType:2,buttonLabel:"レベル上昇"            ,normalizeText:"[LINK COMMUNITY]の コミュニティレベルが[NUMBER]になりました。"}); contentsAdd({contentId:"comm-info-add" ,userType:2,buttonLabel:"お知らせを追加"          ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]にお知らせを追加しました。"}); contentsAdd({contentId:"comm-video-add" ,userType:2,buttonLabel:"動画を追加"            ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]に動画を追加しました。"}); contentsAdd({contentId:"chan-live-onairs" ,userType:3,buttonLabel:"生放送を開始"           ,normalizeText:"チャンネル[LINK CHANNEL]で生放送が開始されました。"}); contentsAdd({contentId:"chan-live-reserve" ,userType:3,buttonLabel:"生放送を予約"           ,normalizeText:"チャンネル[LINK CHANNEL]で[DATE]に生放送が予約されました。"}); contentsAdd({contentId:"chan-blog-add" ,userType:3,buttonLabel:"記事が追加"            ,normalizeText:"チャンネル[LINK CHANNEL]に記事が追加されました。"}); contentsAdd({contentId:"chan-info-add" ,userType:3,buttonLabel:"お知らせを追加"          ,normalizeText:"チャンネル[LINK CHANNEL]にお知らせが追加されました。"}); contentsAdd({contentId:"chan-video-add" ,userType:3,buttonLabel:"動画を追加"            ,normalizeText:"チャンネル[LINK CHANNEL]に動画が追加されました。"}); if(document.querySelector("#nicorepo") ){ addToggleQ(); initQ(); setToggleArea(document.querySelector("#nicorepo>h3")); addStyle(); } }; //styleタグを追加。ここにどんどん追加していく var thisStyle; var addStyle=function(){ var addElement; addElement=document.createElement("style"); document.body.appendChild(addElement); thisStyle=document.styleSheets[document.styleSheets.length-1]; //セーブされてるスタイル情報を適用する //最初に、定義されているコンテンツ情報を読み込む var contentStyles={}; for (let content of contents) { contentStyles[ content.contentId ]=true; } //次に、セーブされているスタイル情報を上書きする for (let checkSaveI of checkSave) { contentStyles[ checkSaveI.contentId ]=checkSaveI.checked; } //最後に、スタイル情報を適用する for(let contentId in contentStyles){ updateStyle(contentId, contentStyles[contentId] ); } }; var updateStyle=function(contentId,flag){ if(flag==true){ thisStyle.insertRule("."+classPrefix+contentId+"{display:block;}",thisStyle.rules.length); }else{ thisStyle.insertRule("."+classPrefix+contentId+"{display:none;}",thisStyle.rules.length); } }; //-----各ニコレポにクラス名を追加 var initQ=function(){ // ノードが追加された時にイベントを仕込む const observeTarget = document.querySelector("#MyPageNicorepoApp") || document.querySelector("#UserPageNicorepoApp"); (new MutationObserver((mutationRecords, observer) => { mutationRecords.forEach((n)=>{ console.log("addedNodes:%o removedNodes:%o",n.addedNodes,n.removedNodes); n.addedNodes.forEach((n)=>{ if(n.nodeName!=="SPAN"){return;} const baseElement = n.parentNode.parentNode.parentNode; initializeOneLog(baseElement); }); }); // observer.disconnect();//切断するチャンスは無い })).observe(observeTarget, {childList:true,subtree:true}); }; var initializeOneLog = function(baseElement){ const bodyElement = baseElement.querySelector(".log-body>span"); if(bodyElement===null){return;} // bodyからリンクを取り除いてノーマライズする const bodyNormalizeText = Array.from(bodyElement.childNodes).map((e)=>{ if(e.nodeType===Node.TEXT_NODE){ return e.nodeValue.trim(); }else if(e.nodeType===Node.ELEMENT_NODE){ const nodeName = e.nodeName; if(nodeName==="STRONG"){ return e.innerText.trim(); }else if(nodeName==="SPAN"){ // 17年0月00日 00:00 に生放送が予約されました。 return "[DATE]"; }else if(nodeName==="A"){ const linkTarget = new URL(e.href); if(linkTarget.hostname==="www.nicovideo.jp" && linkTarget.pathname.indexOf("/user/")===0){ return "[LINK USER]"; }else if(linkTarget.hostname==="com.nicovideo.jp" && linkTarget.pathname.indexOf("/community/")===0){ // http://com.nicovideo.jp/community/co1234?zeromypage_nicorepo return "[LINK COMMUNITY]"; }else if(linkTarget.hostname==="ch.nicovideo.jp" ){ // http://ch.nicovideo.jp/xxxx?zeromypage_nicorepo return "[LINK CHANNEL]"; }else if(linkTarget.hostname==="www.nicovideo.jp" && linkTarget.pathname.indexOf("/mylist/")===0){ // http://www.nicovideo.jp/mylist/1234?zeromypage_nicorepo return "[LINK MYLIST]"; }else if(linkTarget.hostname==="live.nicovideo.jp" && linkTarget.pathname.indexOf("/watch/")===0){ // http://live.nicovideo.jp/watch/lv1234?zeromypage_nicorepo return "[LINK LIVE]"; }else if(linkTarget.hostname==="uad.nicovideo.jp" && linkTarget.pathname.indexOf("/ads/")===0){ // http://uad.nicovideo.jp/ads/?vid=sm1234 return "[LINK UAD]"; }else if(linkTarget.hostname==="nicoad.nicovideo.jp"){ // https://nicoad.nicovideo.jp/video/publish/sm1234 return "[LINK NICOAD]"; }else{ return `[LINK ${linkTarget.href}]`.trim(); } } } return ""; }).map((e)=>{ // 10,000 再生 を [NUMBER]再生 に変換 return e.replace(/\s*[0-9,]+ 再生\s*/g,"[NUMBER]再生"); }).map((e)=>{ // 実況プレイ動画 24時間 総合 ランキングで 2 位 return e.replace(/さんの動画が .+? \d+ 位を達成/g,"さんの動画が[NUMBER]位を達成"); }).map((e)=>{ // マンガ "タイトル" を投稿しました。 return e.replace(/マンガ .+ (を投稿しました。|を登録しました。)$/g,"マンガ[LINK MANGA]$1"); }).map((e)=>{ // コミュニティレベルが 5 になりました。 return e.replace(/コミュニティレベルが \d+ .+$/g,"コミュニティレベルが[NUMBER]になりました。"); }).join(""); // userTypeを決定する let userType; if(bodyNormalizeText.includes("[LINK CHANNEL]")){ userType = 3; }else if(bodyNormalizeText.includes("[LINK COMMUNITY]")){ userType = 2; }else{ userType = 1; } let matchContents = false; for(var i=0;i{ return e.contentId===contents[i].contentId; }).map((e)=>{ return e.checked; }); isChecked = isChecked.length === 0 ? true : isChecked[0]; addElement.innerHTML=`${contents[i].buttonLabel}`; labelStyle(addElement,isChecked); //userType1~3は通常 //userType4は非表示/非表示切り替え addElement.dataset.userType =contents[i].userType; addElement.dataset.contentId=contents[i].contentId; addElement.addEventListener("click",(function(key){ return function(e){ if(e.target.nodeName!="INPUT"){return;} var userType = e.target.parentNode.dataset.userType; var contentId = e.target.parentNode.dataset.contentId; if(e.target.checked==true){ saveUpdateTemp(contentId,true);//セーブ時の為の変数を更新する updateStyle(contentId,true); labelStyle(e.target.parentNode,true);//ラベルの外見を変える // console.log("on %s %s",userType,userClass,thisStyle); }else{ saveUpdateTemp(contentId,false); updateStyle(contentId,false); labelStyle(e.target.parentNode,false); // console.log("of %s %s",userType,userClass,thisStyle); } toggleSaveButton.disabled=false; }; })(i)); if(contents[i].userType==1){ addElementArea1.appendChild(addElement); }else if(contents[i].userType==2){ addElementArea2.appendChild(addElement); }else if(contents[i].userType==3){ addElementArea3.appendChild(addElement); }else if(contents[i].userType==4){ addElementArea4.appendChild(addElement); } } }; var toggleUserTypeEventCreate=function(userType){ // var addElementArea1,addElementArea2,addElementArea3; return function(e){ var clickTargets; if(false){ }else if(userType==1){ clickTargets=addElementArea1; }else if(userType==2){ clickTargets=addElementArea2; }else if(userType==3){ clickTargets=addElementArea3; } clickTargets=clickTargets.querySelectorAll("label"); if(clickTargets.length==0){return;}//無いとは思うけど、要素が無い時はそのまま返す var nextChecked=!clickTargets[0].querySelector("input").checked; for(var i=0;i更新`; toggleButton=document.createElement("a"); toggleButton.href=""; toggleButton.innerHTML=`表示フィルタリング切り替え${checkShowUpdate()?updateButton:""}`; toggleButton.dataset.nowOpen="no"; toggleButton.addEventListener("click",(e)=>{ e.preventDefault(); updateShowUpdate(); if(toggleButton.dataset.nowOpen=="no"){//今は閉じてる toggleArea.style.setProperty("display","block"); toggleButton.dataset.nowOpen="yes"; }else{//今は開いてる toggleArea.style.setProperty("display","none"); toggleButton.dataset.nowOpen="no"; } }); document.querySelector("#nicorepo>h3").appendChild(toggleButton); }; var checkShowUpdate = function(){ const version = localStorage.getItem(`${localStorageKey}-last-click-version`) || 1; if( version < nowVersion ){ // 最後にクリックしたバージョンが、今のバージョンより前だったら表示する return true; }else{ return false; } }; var updateShowUpdate = function(){ localStorage.setItem(`${localStorageKey}-last-click-version`,nowVersion); }; init(); })();