NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name CRAnimere // @namespace Sunnyok // @description Animere on CR // @copyright 2014, Sunnyok // @oujs:author Sunnyok // @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html // @include http://www.crunchyroll.com/* // @include http://www.crunchyroll.ca/* // @version 1.2.1 // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_xmlhttpRequest // @resource CCL_BASE https://sunnyli.github.io/CommentCorePlayer/build/style.css // @resource CSS https://sunnyli.github.io/CommentCorePlayer/style.css // @require https://sunnyli.github.io/CommentCorePlayer/build/CommentCoreLibrary.js // @require https://sunnyli.github.io/CommentCorePlayer/demo/libxml.js // @require https://code.jquery.com/jquery-1.11.1.min.js // ==/UserScript== GM_addStyle ( GM_getResourceText ('CCL_BASE') ); GM_addStyle ( GM_getResourceText ('CSS') ); GM_addStyle ( ' \ .abp .container .cmt{ \ pointer-events: none; \ } \ \ /* FS */ \ #showmedia_video_player{ width: 100%; } \ :-moz-full-screen div.abp{ \ height: calc(100% - 25px) !important; \ width: 100% !important; \ } \ :-moz-full-screen #danmu{ \ background-color: #111 !important; \ } \ :-moz-full-screen #danmu input, \ :-moz-full-screen #danmu select{ \ background-color: transparent; \ border-color: #333; \ color: #3f3f3f; \ } \ :-moz-full-screen #danmu input[type=text]{ \ color: lightgray; \ } \ :-webkit-full-screen, \ :-webkit-full-screen #showmedia_video_player, \ :-webkit-full-screen div#showmedia_video_box, \ :-webkit-full-screen div#showmedia_video_box_wide{\ float: none; \ height: 100%; \ width: 100%; \ } \ :-webkit-full-screen .abp{ \ height: calc(100% - 25px) !important; \ width: 100% !important; \ } \ :-webkit-full-screen #danmu{ \ background-color: #111 !important; \ } \ :-webkit-full-screen #danmu input, \ :-webkit-full-screen #danmu select{ \ background-color: transparent; \ border-color: #333; \ color: #3f3f3f; \ } \ :-webkit-full-screen #danmu input[type=text]{ \ color: lightgray; \ } \ '); function CommentDisplay() { var self = this, retries = 10; this.cm = null; this.player = null; this.server = 'https://anime.re/'; this.title = jQuery('link[rel="index"]')[0].title; this.episode = jQuery('.collection-carousel-media-link-current') .find('.collection-carousel-overlay-top.ellipsis')[0] .textContent.trim(); this.mid = parseInt(jQuery('.collection-carousel-media-link-current') .parent()[0].getAttribute('media_id')); (function construct() { if (jQuery('#commentCanvas').length) { self.cm = new CommentManager(jQuery('#commentCanvas')[0]); self.cm.init(); self.cm.def.scrollScale = 2; commentInit(); self.cm.startTimer(); jQuery('#danmu')[0].addEventListener('submit', self.onComment); jQuery(document).bind('fullscreenchange mozfullscreenchange webkitfullscreenchange', function(){ setTimeout(function() {self.cm.setBounds()}, 1000); if (window.fullScreen) { self.player.style.height = window.screen.availHeight + 10 + 'px'; } else { self.player.style.height = ''; } }) }else{ if (retries-- < 0) return setTimeout(construct, 100); console.log('waiting for commentCanvas node'); } })(); this.load = this.loadCmt = function(url,mode){ CommentLoader(url,this.cm,function(){},mode); } function commentInit() { GM_xmlhttpRequest({ method: "POST", url: self.server + 'cr/init', headers: { "Content-Type": "application/x-www-form-urlencoded" }, data: jQuery.param({ id: self.mid, a: self.title, e: self.episode }), onload: function (response) { if (response.status == 200) { self.cid = String(response.responseText); self.load(self.server + 'solver/resolve?d=' + self.cid + '&r=' + Math.round(Math.random() * new Date / 1000)); jQuery('form#danmu').find('*').attr('disabled', false); jQuery('input:text[name="comment"]').attr("placeholder", " leave a comment") } else { jQuery('form#danmu').find('*').attr('disabled', true); jQuery('input:text[name="comment"]').attr("placeholder", " cannot connect.. π_π") } } }); } this.toggleFullscreen = function() { var element = jQuery('div.ls')[0]; if ((document.fullScreenElement && document.fullScreenElement !== null) || (!document.mozFullScreen && !document.webkitIsFullScreen)) { if (element.requestFullScreen) { element.requestFullScreen(); } else if (element.mozRequestFullScreen) { element.mozRequestFullScreen(); } else if (element.webkitRequestFullScreen) { element.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); } } else { if (document.cancelFullScreen) { document.cancelFullScreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); } } } this.onComment = function (event) { event.preventDefault(); if (jQuery('input:text[name="comment"]').val() === 'fs') { jQuery('input:text[name="comment"]').val(''); self.toggleFullscreen(); } if (jQuery('input:text[name="comment"]').val() !== '') { var cmt = {}; cmt.stime = self.player.getPlayhead() * 1000, cmt.mode = parseInt(jQuery('select#mode').val(), 10), cmt.size = jQuery('select#fontsize').val(), cmt.text = jQuery('input:text[name="comment"]').val(), cmt.border = true; function displaySentDanmaku () { self.cm.timeline.binsert(cmt,function(a,b){ if(a.stime < b.stime){ return -1; }else if (a.stime == b.stime){ return 0; }else{return 1;} }); jQuery('input:text[name="comment"]').attr("placeholder", "comment sent") } function displaySendFailure () { jQuery('input:text[name="comment"]').attr("placeholder", "comment failed") } GM_xmlhttpRequest({ method: "POST", url: self.server + 'danmaku', headers: { "Content-Type": "application/x-www-form-urlencoded" }, data: jQuery.param({ cid: self.cid, stime: (cmt.stime / 1000).toFixed(2), mode: cmt.mode, message: cmt.text, size: cmt.size }), onload: function (response) { if (response.status == 201) { displaySentDanmaku(); } else { displaySendFailure(); } } }); jQuery('input:text[name="comment"]').val(''); } return false; } var video_div; if (jQuery('#showmedia_video_box_wide').length > 0) { video_div = jQuery('#showmedia_video_box_wide'); } else { video_div = jQuery('#showmedia_video_box'); } video_div.wrap('<div class="ls"><div class="abp">' + '<div id="commentCanvas" class="container"></div></div>' + '<form id="danmu">Styles: <select name="mode" id="mode">' + '<option value="1" selected>default</option>' + '<option value="5">top</option>' + '<option value="4">Bottom</option></select>' + '<select name="fontsize" id="fontsize">' + '<option value="15">Small</option>' + '<option value="25" selected>Medium</option>' + '<option value="38">Large</option></select>' + '<input type="text" name="comment" maxlength="50"' + ' placeholder=" connecting to server.." autofocus>' + '<input type="submit" value="Comment"></form></div>' ); jQuery('form#danmu').find('*').attr('disabled', true); // fix styles setTimeout(function(){ self.player = unsafeWindow.jQuery('#showmedia_video_player')[0]; jQuery('.abp')[0].style.height = self.player.getAttribute("height") + 'px'; jQuery('.abp')[0].style.width = self.player.getAttribute("width") + 'px'; }, 0); setInterval(function(){ self.cm.time(self.player.getPlayhead() * 1000); }, 500); } CommentDisplay();