漫海拾贝

在Bangumi条目页查看相似条目,在首页查看个性化推荐条目,在个人设置页面修改设置,另外还可以查看历史推荐和好友推荐

安裝腳本?
作者推薦腳本

您可能也會喜歡 Bangumi时光机

安裝腳本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         漫海拾贝
// @namespace    https://windrises.net
// @version      0.81
// @description  在Bangumi条目页查看相似条目,在首页查看个性化推荐条目,在个人设置页面修改设置,另外还可以查看历史推荐和好友推荐
// @author       windrises
// @run-at       document-end
// @grant        GM_xmlhttpRequest
// @connect      bangumi.brightsphere.xyz
// @require      http://code.jquery.com/jquery-1.8.3.min.js
// @include      /^(https?|http)://(bgm\.tv|bangumi\.tv|chii\.in)/($|subject|user|settings|anime/list)/
// ==/UserScript==

(function() {
    var url = location.pathname;
    url = url.split("/");
    var user_name = $("#headerNeue2").find("[class='avatar']");
    var user_id = "";
    if (user_name.length == 0) user_name = "";
    else {
    	user_id = user_name.children().css("background-image");
    	user_id = user_id.substring(user_id.lastIndexOf("/") + 1, user_id.lastIndexOf(".jpg"));
    	user_name = user_name.attr("href");
    	user_name = user_name.substr(user_name.indexOf("user/") + 5);
        if (user_id == "icon") user_id = user_name;
    }
    if (url.length == 2 && url[1] == "" && user_name != "") index(user_name, user_id);
    else if (url.length == 3 && url[1] == "subject") subject(url[2]);
    else if (url.length == 4 && url[3] == "friends" && user_name == url[2]) user(user_name, user_id);
    else if (url.length == 5 && url[1] + url[2] == "animelist" && user_name == url[3]) recommended(user_name, user_id);
    else if (url.length >= 2 && url[1] == "settings" && user_name != "") settings(user_name, user_id);
})();

function index_show(ret, index_cnt) {
	if (ret.error) return;
	var html = '';
    for (var i = index_cnt * 3; i < Math.min((index_cnt + 1 ) * 3, ret.index.length); i ++) {
    	var x = ret.index[i];
		html += '<div class="mainItem" style="width:170px; margin: 5px 0px 5px 50px">' +
        '<a href="/subject/' + x.id + '" title="' + x.name + '" class="rcmdIndexTitle">' +
		'<div class="image" style="width:160px; height:220px; background:#000 url(' + x.img + ') 50%">' +
		'<div class="overlay" style="width:160px; height:220px;">' +
		'<p class="title" style="width:100px; height:50px; left:40px; top:80%">' + x.name + '</p>' +
		'</div>' +
		'</div>' +
		'</a>' +
		'</div>';
	}
	$("#featuredItems").html(html);
	$(".rcmdIndexTitle").on("mouseover", function() {
		$(this).find('p').css('top', '30%');
	});
	$(".rcmdIndexTitle").on("mouseout", function() {
		$(this).find('p').css('top', '80%');
	});
}

function index(user_name, user_id) {
    $("#prgCatrgoryFilter > li > a").click(function() {
        $("#featuredItems").hide();
        $("#prgManagerMain").show();
        $("#listWrapper").css("width", "240px");
        $("#listWrapper > div").eq(0).css("width", "240px");
        $("#listWrapper > div > div").eq(0).css("width", "240px");
	});
    $("#prgCatrgoryFilter").append('<li><a id="dailyRcmdBtn" href="javascript:void(0);">每日推荐</a></li>');
    var index_cnt = 0;
    var rcmd = '';
    $("#dailyRcmdBtn").on("click", function() {
        $("#prgCatrgoryFilter").find("[class='focus']").removeClass("focus");
        $("#dailyRcmdBtn").addClass("focus");
        $("#prgManagerMain").hide();
        var html = '<ul id="featuredItems" class="featuredItems">' +
    		'</ul>';
    	if ($("#featuredItems").length == 0) $("#prgManager").append(html);
        if ($("#featuredItems > div").length != 0) {
	        if ($("#featuredItems").is(":hidden")) $("#featuredItems").show();
	        else {
	        	index_cnt = (index_cnt + 1) % Math.floor((rcmd.index.length + 2) / 3);
	        	index_show(rcmd, index_cnt);
	        }
	    } else {
	    	$.getJSON("https://windrises.net/bgmtools/recommend/api?type=index&user_name=" + user_name + "&user_id=" + user_id, function(ret){
	    		rcmd = ret;
	    		index_show(ret, 0);
	    	});
	    }
    });
}

function subject(id) {
    $.getJSON("https://windrises.net/bgmtools/recommend/api?type=subject&id=" + id, function(ret){
        if (ret.error) {
        	Bangumi_Plus(id);
        	return;
        }
        var html = '';
        if (ret.item.length > 0) {
        	html += '<div class="subject_section">' +
		    '<a id="moreItemBtn" href="javascript:void(0);" class="more">更多推荐 »</a>' +
		    '<h2 class="subtitle">相似条目</h2>' +
		    '<div class="content_inner clearit" align="left">' +
		    '<ul class="coversSmall">' +
		    '</ul>' +
		    '</div>' +
		    '</div>';
        }
        if (ret.sub.length > 0) {
        	html += '<div class="subject_section">' +
		    '<a id="moreSubBtn" href="javascript:void(0);" class="more">更多推荐 »</a>' +
		    '<h2 class="subtitle">可能喜欢</h2>' +
		    '<div class="content_inner clearit" align="left">' +
		    '<ul class="coversSmall">' +
		    '</ul>' +
		    '</div>' +
		    '</div>';
        }
        $("#columnSubjectHomeB").find("[class='subject_section']").eq(0).after(html);
        var item_cnt = 0;
    	var sub_cnt = 0;
    	var right = new Array(8, 24, 48);
        $("#moreItemBtn").on("click", function() {
			var html = '';
			for (var i = 0; i < Math.min(right[item_cnt], ret.item.length); i ++) {
	        	var x = ret.item[i];
	        	html += '<li class="clearit">' +
				    '<a href="/subject/' + x.id + '" class="avatar thumbTip">' +
				    '<span class="avatarNeue avatarSize75" style="background-image:url(' + x.img + ')"></span>' +
				    '</a>' +
				    '<p class="info"><a href="/subject/' + x.id + '" class="l">' + x.name +'</a></p>' +
				    '</li>';
			}
	        $("#columnSubjectHomeB").find("[class='subject_section']").eq(1).find("[class=coversSmall]").html(html);
	        item_cnt = (item_cnt + 1) % 3;
	    });
	    $("#moreSubBtn").on("click", function() {
	        var html = '';
			for (var i = 0; i < Math.min(right[sub_cnt], ret.sub.length); i ++) {
	        	var x = ret.sub[i];
	        	html += '<li class="clearit">' +
				    '<a href="/subject/' + x.id + '" class="avatar thumbTip">' +
				    '<span class="avatarNeue avatarSize75" style="background-image:url(' + x.img + ')"></span>' +
				    '</a>' +
				    '<p class="info"><a href="/subject/' + x.id + '" class="l">' + x.name +'</a></p>' +
				    '</li>';
			}
	        $("#columnSubjectHomeB").find("[class='subject_section']").eq(2).find("[class=coversSmall]").html(html);
	        sub_cnt = (sub_cnt + 1) % 3;
	    });
	    $("#moreItemBtn").trigger("click");
        $("#moreSubBtn").trigger("click");
        Bangumi_Plus(id);
    });
}

function user(user_name, user_id) {
    $("#headerProfile").find("[class='focus']").parent().after('<li><a id="rcmdUserBtn" href="javascript:void(0);">好友推荐</a></li>');
    $("#rcmdUserBtn").on("click", function() {
	    $("#headerProfile").find("[class='focus']").removeClass("focus");
	    $("#rcmdUserBtn").addClass("focus");
	    $.getJSON("https://windrises.net/bgmtools/recommend/api?type=user&user_name=" + user_name + "&user_id=" + user_id, function(ret){
	        if (ret.error) return;
	        var html = '';
			for (var i in ret.user) {
	        	var x = ret.user[i];
	        	html += '<li class="user" style="width:24%">' +
				'<div class="userContainer">' +
				'<strong>' +
				'<a href="/user/' + x.user_name + '" class="avatar">' +
				'<span class="userImage">' +
				'<img src="' + x.avatar + '" class="avatar"></span> ' + x.nick_name + '</a></strong>' +
				'</div>' +
				'</li>';
			}
	        $("#memberUserList").html(html);
	    });
	});
}

function recommended(user_name, user_id) {
	$("#headerProfile").find("[class=navSubTabs]").append('<li><a id="recommendedBtn" href="javascript:void(0);"><span>历史推荐</span></a></li>');
	$("#recommendedBtn").on("click", function() {
		$("#headerProfile").find("[class='focus']").removeClass("focus");
        $("#recommendedBtn").addClass("focus");
        $("#browserTools").hide();
        $.getJSON("https://windrises.net/bgmtools/recommend/?type=recommended&user_name=" + user_name + "&user_id=" + user_id, function(ret){
	    	if (ret.error) return;
	    	var html = "";
	    	for (var i in ret.recommended) {
	    		var x = ret.recommended[i];
	    		var namechs = x.namechs;
	        	if (namechs == "") namechs = x.name;
				html += '<li class="item even clearit">' +
					'<div class="inner">' +
					'<h3>' +
					'<a href="/subject/' + x.id + '" class="l">' + namechs + '</a> <small class="grey">' + x.name + '</small>' +
					'</h3>' +
					'<p class="info tip">' +
					'推荐日期:' + x.date;
				if (x.type.id != 0) {
					html += ' / 推荐来源:' + '<a href="/subject/' + x.type.id + '">' + x.type.name + '</a>';
				}
				html += '</p></div></li>';
			}
	    	$("#browserItemList").html(html);
	    	$("#multipage").hide();
	    	$("#columnSubjectBrowserB").hide();
	    });
	});
}

function settings(user_name, user_id) {
    $("#header > ul").append('<li><a id="rcmdSetBtn" href="javascript:void(0);"><span>漫海拾贝</span></a></li>');
    $("#rcmdSetBtn").on("click", function() {
        $("#header").find("[class='selected']").removeClass("selected");
        $("#rcmdSetBtn").addClass("selected");
        $.getJSON("https://windrises.net/bgmtools/recommend/?type=settings&user_name=" + user_name + "&user_id=" + user_id, function(ret){
	    	if (ret.error) return;
	    	var score_below = "", score_above = "", rank_below = "", rank_above = "", rating_below = "", rating_above = "";
	    	if (ret.score_below) score_below = ret.score_below;
	    	if (ret.score_above) score_above = ret.score_above;
	    	if (ret.rank_below) rank_below =ret.rank_below;
	    	if (ret.rank_above) rank_above = ret.rank_above;
	    	if (ret.rating_below) rating_below = ret.rating_below;
	    	if (ret.rating_above) rating_above = ret.rating_above;
	    	var html = '<form>' +
				   '<span class="text">' +
				   '<table align="center" width="98%" cellspacing="0" cellpadding="5" class="settings">' +
				   '<tbody>' +
				   '<tr><td valign="top" width="23%"></td>' +
				   '<td valign="top"><input id="updateBtn" class="inputBtn" value="同步数据" readonly unselectable="on" style="width:53px">' +
				   '<a id="alert_update" style="color: #F09199; font-size: 14px; padding: 20px"></a></td></tr>' +
				   '<tr><td valign="top" width="23%">减少推荐分数低于<br />的条目</td>' +
				   '<td valign="top"><input id="score_below" class="inputtext" type="text" value="' + score_below + '"></td></tr>' +
				   '<tr><td valign="top" width="23%">减少推荐分数高于<br />的条目</td>' +
				   '<td valign="top"><input id="score_above" class="inputtext" type="text" value="' + score_above + '"></td></tr>' +
				   '<tr><td valign="top" width="23%">减少推荐排名低于<br />的条目</td>' +
				   '<td valign="top"><input id="rank_below" class="inputtext" type="text" value="' + rank_below + '"></td></tr>' +
				   '<tr><td valign="top" width="23%">减少推荐排名高于<br />的条目</td>' +
				   '<td valign="top"><input id="rank_above" class="inputtext" type="text" value="' + rank_above + '"></td></tr>' +
				   '<tr><td valign="top" width="23%">减少推荐评分人数低于<br />的条目</td>' +
				   '<td valign="top"><input id="rating_below" class="inputtext" type="text" value="' + rating_below + '"></td></tr>' +
				   '<tr><td valign="top" width="23%">减少推荐评分人数高于<br />的条目</td>' +
				   '<td valign="top"><input id="rating_above" class="inputtext" type="text" value="' + rating_above + '"></td></tr>' +
				   '<tr><td valign="top" width="23%">过滤掉含有<br />标签的条目</td>' +
				   '<td valign="top"><input id="filter_tag" class="inputtext" type="text" placeholder="空格分割" value="' + ret.filter_tag + '"></td></tr>' +
				   '<tr><td valign="top" width="23%"></td>' +
				   '<td valign="top"><input id="submitBtn" class="inputBtn" value="确定" readonly unselectable="on" style="width:26px">' +
				   '<a id="alert_submit" style="color: #F09199; font-size: 14px; padding: 20px"></a></td></tr>' +
				   '</tbody></table>' +
				   '</span>' +
				   '</form>';
        	$("#columnA").html(html);
        	$("input[readonly]").on('focus', function() {
			    $(this).trigger('blur');
			});
        	$("#updateBtn").on("click", function() {
	        	$.ajax({
	        		url: "https://windrises.net/bgmtools/recommend",
		            type: "POST",
		            tradition: true,
		            data: {type: "settings_update", user_name: user_name, user_id: user_id},
		            success: function (ret) {
		            	ret = JSON.parse(ret);
		            	$("#alert_update").html(ret.status);
		            }
	        	});
	        });
	        $("#submitBtn").on("click", function() {
	        	var score_below = $("#score_below").attr("value");
	        	var score_above = $("#score_above").attr("value");
	        	var rank_below = $("#rank_below").attr("value");
	        	var rank_above = $("#rank_above").attr("value");
	        	var rating_below = $("#rating_below").attr("value");
	        	var rating_above = $("#rating_above").attr("value");
	        	var filter_tag = $("#filter_tag").attr("value");
	        	if (score_below == "") score_below = 0;
	        	if (score_above == "") score_above = 0;
	        	if (rank_below == "") rank_below = 0;
	        	if (rank_above == "") rank_above = 0;
	        	if (rating_below == "") rating_below = 0;
	        	if (rating_above == "") rating_above = 0;
	        	$.ajax({
	        		url: "https://windrises.net/bgmtools/recommend",
		            type: "POST",
		            tradition: true,
		            data: { type: "settings_submit", user_name: user_name, user_id: user_id,
		            		score_below: score_below, score_above: score_above,
		            		rank_below: rank_below, rank_above: rank_above,
		            		rating_below: rating_below, rating_above: rating_above,
		            		filter_tag: filter_tag},
		            success: function (ret) {
		            	ret = JSON.parse(ret);
		            	$("#alert_submit").html(ret.status);
		            }
	        	});
	        });
	    });
    });
}

// from http://bgm.tv/group/topic/345713
function Bangumi_Plus(id) {
    'use strict';

    GM_request(`https://bangumi.brightsphere.xyz/api/subjects/${id}/`).then(JSON.parse).then(data => {
        let subjects = '';
        for (let i in data.recommendations) {
            let rmd = data.recommendations[i];
            let subtitle = '';
            if (rmd.auto) {
                continue;
            } else {
                subtitle = `${rmd.count}人推荐`;
            }
            let subject = rmd.subject;
            subjects += `<li>
						<span class="sub">${subtitle}</span>
						<a href="https://bangumi.brightsphere.xyz/recommendation/${rmd.key}" title="查看详情" class="avatar thumbTip"><span class="avatarNeue avatarSize75" style="background-image:url('${subject.cover.replace('http:','')}')"></span></a>
						<a href="/subject/${subject.id}" class="title">${subject.main_name}</a>
						</li>`;
        }
        let block = `<div class="subject_section">
					<div class="clearit">
					<div class="rr"><a href="https://bangumi.brightsphere.xyz/subject/${id}" class="chiiBtn"><span>关联推荐</span></a></div>
					<h2 class="subtitle">相关推荐</h2>
					</div>
					<div class="content_inner">
					<ul class="browserCoverMedium clearit">${subjects}</ul>
					</div>
					</div>`;
        $(".subject_section > .subtitle:contains('评论')").parent().before(block);
    });
    function GM_request(url, responseType, method) {
	    return new Promise(function(resolve, reject) {
	        GM_xmlhttpRequest({
	            method: method || 'GET',
	            url,
	            responseType,
	            onload: xhr => {
	                if (xhr.status >= 200 && xhr.status < 300) {
	                    resolve(xhr.response);
	                } else {
	                    reject(xhr);
	                }
	            },
	            onerror: xhr => {
	                reject(xhr);
	            }
	        });
	    });
	}
}