// ==UserScript== // @name Bangumi EpPopuVisualizer // @namespace http://bgm.tv/user/prevails // @version 0.2.6.1 // @description 标注ep的讨论人气 // @author "Donuts." // @grant GM_getValue // @grant GM_setValue // @match http://bgm.tv/subject/* // @match http://bgm.tv/ // @match https://bgm.tv/subject/* // @match https://bgm.tv/ // @match http://bangumi.tv/subject/* // @match http://bangumi.tv/ // @match http://chii.in/subject/* // @match http://chii.in/ // @require https://code.jquery.com/jquery-2.2.4.min.js // @encoding utf-8 // @downloadURL none // ==/UserScript== function noNeed(isRoot) { if (isRoot) { return $('a.load-epinfo').length === 0; } else { return ($('a.focus.chl.anime').length === 0 && $('a.focus.chl.real').length === 0) || $('a.load-epinfo').length === 0; } } function getMax(arr) { if (arr.length === 0) { return 0; } return arr.reduce(function (a, b) {return a > b ? a : b;}); } function getValues($lis) { var ids = []; $lis.each(function () { var $a = $(this).find('a'); var id = $a[0].id.replace("prg_", ''); ids.push(id); }); return ids.map(getEpValue); } function colorToRgbaX(color) { var r = parseInt('0x' + color.substr(1, 2)); var g = parseInt('0x' + color.substr(3, 2)); var b = parseInt('0x' + color.substr(5, 2)); return `rgba(${r},${g},${b},X)`; } function getPixel($e, attr) { return parseInt($e.css(attr)); } function histogram_getHeight($a) { return getPixel($a, 'height') + 2 + getPixel($a, 'padding-top') + getPixel($a, 'padding-bottom'); } function getShowMethod(viewMode) { var $expA = $('a.load-epinfo:eq(0)'); var bottomPx = $expA.css('margin-bottom'); var rightPx = $expA.css('margin-right'); switch(viewMode) { case 'default': var colorX = colorToRgbaX(GM_getValue("default_color")); return function ($lis, values) { var max = getMax(values); if (max < 20) { max += (20 - max) / 2; } var colors = values.map(default_getColor(colorX, max)); $lis.each(function (index) { var $a = $('a', this); $a.append(`
`); }); }; ///////////////////////////// case 'histogram': var color = GM_getValue("histogram_color"); var height = histogram_getHeight($expA); return function ($lis, values) { var max = getMax(values); if (max < 20) { max += (20 - max) / 2; } var lengths = values.map(histogram_getLength(height, max)); $lis.each(function (index) { var $a = $('a', this); $a.append(``); }); }; } } function getEpValue(id) { var value = $(`#subject_prg_content > #prginfo_${id} small.na`).html(); value = value.substring(2, value.length - 1); return parseInt(value); } function default_getColor(colorX, max) { return function (v) { return colorX.replace('X', v / max); }; } function histogram_getLength(height, max) { return function (v) { return height * v / max; }; } function init() { if (!GM_getValue('viewMode')) { GM_setValue('viewMode', "default"); } if (!GM_getValue('default_color')) { GM_setValue('default_color', '#ff8040'); } if (!GM_getValue('histogram_color')) { GM_setValue('histogram_color', '#f7bac0'); } } var isControlPanelLoaded = false; function addControlPanel() { $('#columnHomeB').append(''); var $cp = $('#ep_popu_visualizer_control_panel'); var mode = GM_getValue('viewMode'); function refreshColor() { $('#epv_color_pick input').val(GM_getValue(GM_getValue('viewMode') + '_color')); } $('.epv_control_panel_switch').click(function () { if (!isControlPanelLoaded) { var $content = $( ` ` ); $cp.append($content); $('#epv_mode_select input').click(function () { GM_setValue('viewMode', $(this).val()); refreshColor(); }); $('#epv_color_pick input').change(function () { GM_setValue(GM_getValue('viewMode') + "_color", $(this).val()); refreshColor(); }); isControlPanelLoaded = true; } $(".epv_content", $cp).slideToggle('fast'); }); } function main() { init(); var isRoot = location.pathname === '/'; if (isRoot) { addControlPanel(); } if (noNeed(isRoot)) { return; } var $uls; if (isRoot) { $uls = $('.infoWrapper_tv .prg_list'); } else { $uls = $('.prg_list'); } var show = getShowMethod(GM_getValue('viewMode')); $uls.each(function (index, element) { setTimeout(function () { var $lis = $('li:not(.subtitle)', element); var values = getValues($lis); show($lis, values); }, 150 * index + 500); }); } main();