// ==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();
})();