Skip to content

Instantly share code, notes, and snippets.

@Juici
Forked from crapier/Kissanime_cleaner.md
Last active April 10, 2017 17:08
Show Gist options
  • Save Juici/4f9ce7f72790337567b4c93f76589b79 to your computer and use it in GitHub Desktop.
Save Juici/4f9ce7f72790337567b4c93f76589b79 to your computer and use it in GitHub Desktop.
Userscript for removing bloat from KissAnime site, also adds random features.

KissAnime Cleaner

This userscript for KissAnime is a fork of the original by crapier. It removes large chunks of the site that I do not use, including any options to login or use features only for members. I will be updating this fork as the original is updated applying fixes where neccessary and minor tweaks of my own.

Features

  • Removes any link, tabs, buttons, pages, etc. that I will never use.
    • Also removes ads on any pages that still remain
  • Use up and down arrow keys to navigate suggested search results box on all pages (top right)
  • Fake fullscreen mode toggle with \ key
    • Maintained across page loads, if you make your browser fullscreen with F11 it will look like real fullscreen. Seek bar is hidden in HTML5 player when in fake fullscreen.
  • Configurable Options (Press Home key on keyboard or the option in the User Script Commands menu for KissAnime Cleaner menu)
    • Pause the video on page load
    • Automatically advance to the next video when the current one finishes
      • Option to chooses how many videos to play (-1 for continuous playback)
    • Automatically scroll down some on video pages
    • Resize Video Area to keep it centered and visible in smaller windows
    • Use the arrow keys to go to the previous or next video (only when video is paused)
    • Use the - and = keys to increase and decrease the playback speed for HTML5 player (flash player does not provide support)
    • Player option (flash, html5) moved to KissAnime Clear menu (home key on keyboard)
    • Select preferred quality (should now work for both flash and html5)
      • Will attempt to set quality of video to selected value or next lowest value if selected is not available
    • Set Player Volume

The script also works on KissCartoon and KissAsian.

Usage

Only tested in FireFox with Greasemonkey (should work with Tapermonkey and Chrome).

  • Get Greasemonkey for FireFox if you don't already have it.
  • Click on the raw link for kissanime_cleaner.user.js below, wait 5 seconds, and click install to add the script.

Feel free to borrow, modify, and/or steal any of the script for your own needs. No credit is required.

// ==UserScript==
// @name KissAnime Cleaner
// @namespace 9001
// @description Cleans up KissAnime pages. Tested to work with Firefox and Greasemonkey.
// @include https://kissanime.to/*
// @include http://kissanime.to/*
// @include https://kisscartoon.me/*
// @include http://kisscartoon.me/*
// @include https://kissasian.com/*
// @include http://kissasian.com/*
// @version 3.3.15.1
// @downloadURL https://gist.github.com/Juici/4f9ce7f72790337567b4c93f76589b79/raw/kissanime_cleaner.user.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @grant unsafeWindow
// ==/UserScript==
// Prevent script from running in frames and iframes
if (window.top != window.self) {
return;
}
// Get the pages jQuery
var $ = unsafeWindow.jQuery;
// Option constants
var PLAYER_FLASH = 0;
var PLAYER_HTML5 = 1;
// Option variables
var pause_option = GM_getValue("pause", true);
var quality_option = GM_getValue("quality", '1080');
var autoplay_option = GM_getValue("auto", true);
var autoplay_count = GM_getValue("auto_count", -1)
var autoscroll_option = GM_getValue("scroll", true);
var player_option = GM_getValue("player", PLAYER_FLASH);
var resize_option = GM_getValue("resize", true);
var arrow_key_navagation = GM_getValue("arrow_nav", true);
var speed_control = GM_getValue("speed_control", true);
var volume_control = GM_getValue("volume_control", 100);
var remove_login = GM_getValue("remove_login", true);
var remove_comments = GM_getValue("remove_comments", true);
var fake_fullscreen = GM_getValue("fake_fullscreen", false);
// Current page url
var url = document.location.href;
// Regular Expressions to check against for determining what type page currently on and what to clean
var home = /http:\/\/kissanime\.to\/$|https:\/\/kissanime\.to\/$|http:\/\/kisscartoon\.me\/$|https:\/\/kisscartoon\.me\/$|http:\/\/kissasian\.com\/$|https:\/\/kissasian\.com\/$/;
var anime_list = /http:\/\/kissanime\.to\/(AnimeList|Genre|Status|Search|UpcomingAnime)|https:\/\/kissanime\.to\/(AnimeList|Genre|Status|Search|UpcomingAnime)|http:\/\/kisscartoon\.me\/(CartoonList|Status|Genre|Search)|https:\/\/kisscartoon\.me\/(CartoonList|Status|Genre|Search)|http:\/\/kissasian\.com\/(DramaList|Status|Country|Genre|Search)|https:\/\/kissasian\.com\/(DramaList|Status|Country|Genre|Search)/;
var anime_page = /http:\/\/kissanime\.to\/Anime\/[^\/]*$|https:\/\/kissanime\.to\/Anime\/[^\/]*$|http:\/\/kisscartoon\.me\/Cartoon\/[^\/]*$|https:\/\/kisscartoon\.me\/Cartoon\/[^\/]*$|http:\/\/kissasian\.com\/Drama\/[^\/]*$|https:\/\/kissasian\.com\/Drama\/[^\/]*$/;
var video_page = /http:\/\/kissanime\.to\/Anime\/[^\/]*\/[^\/]*\?id=\n*|https:\/\/kissanime\.to\/Anime\/[^\/]*\/[^\/]*\?id=\n*|http:\/\/kisscartoon\.me\/Cartoon\/[^\/]*\/[^\/]*\?id=\n*|https:\/\/kisscartoon\.me\/Cartoon\/[^\/]*\/[^\/]*\?id=\n*|http:\/\/kissasian\.com\/Drama\/[^\/]*\/[^\/]*\?id=\n*|https:\/\/kissasian\.com\/Drama\/[^\/]*\/[^\/]*\?id=\n*/;
//---------------------------------------------------------------------------------------------------------------
// Clean Home page
//---------------------------------------------------------------------------------------------------------------
if (home.test(url)) {
console.log('Performing Cleaning for Home Page');
// Remove Sections from the right side of the page
//Get the rightside from the document
var rightside = document.getElementById('rightside');
// Check if the rightside exist and proceed if it does
if (rightside) {
// Loop through all righside elements
for (var i = 0; i < rightside.childElementCount; i++) {
// Check to make sure element has children
if (rightside.children[i].childElementCount > 0) {
// Check for children that to be removed
if (rightside.children[i].children[0].textContent.search('Remove ads') > 0 ||
rightside.children[i].children[0].textContent.search('Like me please') > 0 ||
rightside.children[i].children[0].textContent.search('omments') > 0) {
// Remove Child if it matches, decrement index to account for removing the child
rightside.removeChild(rightside.children[i--]);
// Check if the next element is a clear2 div and remove it if it is
if (i + 1 > -1 && i + 1 < rightside.childElementCount) {
if (rightside.children[i + 1].className == 'clear2') {
rightside.removeChild(rightside.children[i + 1]);
}
}
}
}
}
}
// Remove Register link in nav sub bar
var navsub = document.getElementById('navsubbar');
if (navsub) {
navsub.children[0].children[0].remove();
navsub.children[0].childNodes[1].remove();
}
//Remove ads
var leftad = document.getElementById('divFloatLeft');
if (leftad) {
leftad.remove();
}
var rightad = document.getElementById('divFloatRight');
if (rightad) {
rightad.remove();
}
var middlead2 = document.getElementById('divAds2');
if (middlead2) {
middlead2.remove();
}
var middlead = document.getElementById('divAds');
if (middlead) {
middlead.remove();
}
// Removes adspaces
var adspace1 = document.getElementById('adsIfrme1');
if (adspace1) {
adspace1.remove();
}
// Remove or hide stubborn ads
var adcheck_count = 0;
var adremover = setInterval(function() {
adcheck_count++;
var body = document.body;
if (body.childElementCount > 1) {
var inital_count = body.childElementCount;
for (var i = inital_count - 1; i > 0 ; i--) {
body.children[i].remove();
}
}
var container = document.getElementById('containerRoot');
var total_elements = container.childElementCount;
for (var i = total_elements - 1; container.children[i].id != 'container' ; i--) {
container.children[i].style.visibility = 'hidden';
container.children[i].style.height = '0px';
container.children[i].style.width = '0px';
}
if (adcheck_count == 50) {
clearInterval(adremover);
}
}, 100);
console.log('Done!');
}
//---------------------------------------------------------------------------------------------------------------
// Clean Anime List Pages
//---------------------------------------------------------------------------------------------------------------
if (anime_list.test(url)) {
console.log('Performing Cleaning for Anime List Pages');
// Remove large spaces left by empty adspace
// Get the ads frame
var adspace = document.getElementById('adsIfrme1');
// If the ad frame was gotten proceed
if (adspace) {
// Check and remove the clear before the adspace
if (adspace.parentElement.previousElementSibling && adspace.parentElement.previousElementSibling.className == 'clear') {
adspace.parentElement.previousElementSibling.remove();
}
// Check and remove the clear a bit after the adspace
if (adspace.parentElement.nextElementSibling && adspace.parentElement.nextElementSibling.nextElementSibling &&
adspace.parentElement.nextElementSibling.nextElementSibling.nextElementSibling &&
adspace.parentElement.nextElementSibling.nextElementSibling.nextElementSibling.className == 'clear') {
adspace.parentElement.nextElementSibling.nextElementSibling.nextElementSibling.remove();
}
// Remove the adspace's parent (and thus it)
adspace.parentElement.remove();
}
//Remove other ads
var leftad = document.getElementById('divFloatLeft');
if (leftad) {
leftad.remove();
}
var rightad = document.getElementById('divFloatRight');
if (rightad) {
rightad.remove();
}
var adspace2 = document.getElementById('adsIfrme2');
if (adspace2) {
adspace2.remove();
}
// Remove or hide stubborn ads
var adcheck_count = 0;
var adremover = setInterval(function() {
adcheck_count++;
var body = document.body;
if (body.childElementCount > 1) {
var inital_count = body.childElementCount;
for (var i = inital_count - 1; i > 0 ; i--) {
body.children[i].remove();
}
}
var container = document.getElementById('containerRoot');
var total_elements = container.childElementCount;
for (var i = total_elements - 1; container.children[i].id != 'container' ; i--) {
container.children[i].style.visibility = 'hidden';
container.children[i].style.height = '0px';
container.children[i].style.width = '0px';
}
if (adcheck_count == 50) {
clearInterval(adremover);
}
}, 100);
console.log('Done!');
}
//---------------------------------------------------------------------------------------------------------------
// Clean Episode List Pages
//---------------------------------------------------------------------------------------------------------------
if (anime_page.test(url)) {
console.log('Performing Cleaning for Episode List Pages');
// Remove large spaces left by empty adspace
// Get the ads frame
var adspace = document.getElementById('adsIfrme1');
// If the ad frame was gotten proceed
if (adspace) {
// Check and remove the clear before the adspace
if (adspace.parentElement.previousElementSibling && adspace.parentElement.previousElementSibling.className == 'clear') {
adspace.parentElement.previousElementSibling.remove();
}
// Check and remove the clear a bit after the adspace
if (adspace.parentElement.nextElementSibling && adspace.parentElement.nextElementSibling.nextElementSibling &&
adspace.parentElement.nextElementSibling.nextElementSibling.nextElementSibling &&
adspace.parentElement.nextElementSibling.nextElementSibling.nextElementSibling.className == 'clear') {
adspace.parentElement.nextElementSibling.nextElementSibling.nextElementSibling.remove();
}
// Remove the adspace's parent (and thus it)
adspace.parentElement.remove();
}
//Remove other ads
var leftad = document.getElementById('divFloatLeft');
if (leftad) {
leftad.remove();
}
var rightad = document.getElementById('divFloatRight');
if (rightad) {
rightad.remove();
}
var middlead = document.getElementById('divAds');
if (middlead) {
middlead.remove();
}
// Remove share stuff from episode list pages
var eplist = $('div.barContent.episodeList')[0].children[1];
if (eplist) {
// Page has episodes
if (eplist.childElementCount > 3) {
// delete all elements before the listings
eplist.children[0].remove();
eplist.children[0].remove();
eplist.children[0].remove();
eplist.children[0].remove();
}
// Page has no episdoes (not aired)
else {
eplist.children[0].remove();
eplist.children[0].remove();
eplist.children[0].remove();
}
}
if (remove_comments) {
// Remove comments
var comment_location = 2;
if (/kissasian/.test(url)) {
comment_location = 3;
}
var comments = $('div.bigBarContainer')[comment_location];
if (comments) {
comments.remove();
}
}
var bookmark_link = document.getElementById('spanBookmark');
if (bookmark_link) {
bookmark_link.remove();
}
// Remove or hide stubborn ads
var adcheck_count = 0;
var adremover = setInterval(function() {
adcheck_count++;
var body = document.body;
if (body.childElementCount > 1) {
var inital_count = body.childElementCount;
for (var i = inital_count - 1; i > 0 ; i--) {
body.children[i].remove();
}
}
var container = document.getElementById('containerRoot');
var total_elements = container.childElementCount;
for (var i = total_elements - 1; container.children[i].id != 'container' ; i--) {
container.children[i].style.visibility = 'hidden';
container.children[i].style.height = '0px';
container.children[i].style.width = '0px';
}
var rightside = document.getElementById('rightside');
total_elements = rightside.childElementCount;
for (var i = total_elements - 1; rightside.children[i].className != 'rightBox' ; i--) {
rightside.children[i].style.visibility = 'hidden';
rightside.children[i].style.height = '0px';
rightside.children[i].style.width = '0px';
}
if (adcheck_count == 50) {
clearInterval(adremover);
}
}, 100);
// Remove space before episodes
$('table.listing').css('margin-top', '-18px');
console.log('Done!');
}
//---------------------------------------------------------------------------------------------------------------
// Clean Video Page
//---------------------------------------------------------------------------------------------------------------
if (video_page.test(url)) {
console.log('Performing Cleaning for Video Page');
// Override functions so they wont be do anything when called by the pages code
// Function to inject into page
var override = function() {
DoDetect2 = function() {}
CheckAdImage = function() {}
}
// Create script to inject
var script1 = document.createElement('script');
script1.type = "text/javascript";
script1.innerHTML = 'var override = ' + override.toString();
// inject the script
document.getElementsByTagName('head')[0].appendChild(script1);
// Call our new function
unsafeWindow.override();
// Removes adspaces
var adspace6 = document.getElementById('adsIfrme6');
if (adspace6) {
adspace6.remove();
}
var adspace7 = document.getElementById('adsIfrme7');
if (adspace7) {
adspace7.remove();
}
var adspace8 = document.getElementById('adsIfrme8');
if (adspace8) {
adspace8.remove();
}
var adspace10 = document.getElementById('adsIfrme10');
if (adspace10) {
adspace10.remove();
}
var adspace11 = document.getElementById('adsIfrme11');
if (adspace11) {
adspace11.remove();
}
var adCheck1 = document.getElementById('adCheck1');
if (adCheck1) {
adCheck1.remove();
}
var adCheck2 = document.getElementById('adCheck2');
if (adCheck2) {
adCheck2.remove();
}
var adCheck3 = document.getElementById('adCheck3');
if (adCheck3) {
adCheck3.remove();
}
var divdownload = document.getElementById('divDownload');
if (divdownload) {
divdownload.remove();
}
var divfilename = document.getElementById('divFileName');
if (divfilename) {
divfilename.remove();
}
// Removes Empty spaces from Video pages
// Remove Clears
var vid_parent = document.getElementById('centerDivVideo').parentElement;
for (var i = 0; i < vid_parent.childElementCount; i++) {
if (vid_parent.children[i].className == 'clear' || vid_parent.children[i].className == 'clear2') {
vid_parent.removeChild(vid_parent.children[i--]);
}
}
vid_parent.children[1].remove();
if (remove_comments) {
// Get the comment section on the video pages
var comments = document.getElementById('btnShowComments');
// If it exist remove it and the element just prior to it also, share stuff of some kind
if (comments) {
comments = comments.parentElement;
comments.previousElementSibling.remove();
comments.previousElementSibling.remove();
comments.previousElementSibling.remove();
comments.remove();
}
// remove comments for kisscartoon site
var alt_comments = document.getElementById('divComments');
if (alt_comments) {
alt_comments.previousElementSibling.remove();
alt_comments.previousElementSibling.remove();
alt_comments.remove();
}
}
// Hide on page quality selector, conflicts with custom menu selector
var page_select_player = document.getElementById('selectPlayer');
if (page_select_player) {
page_select_player.parentElement.style.cssText = 'display:none;';
}
// hide lights off feature that is pointless with ads already removed
var lights_off = document.getElementById('switch');
if (lights_off) {
lights_off.remove();
}
// remove device player link and text
$('.clsTempMSg').remove();
var USE_FLASH_FOR_PAGE;
var YOUTUBE_FLASH_PLAYER;
if (player_option == PLAYER_FLASH) {
if (document.cookie.indexOf('usingFlashV1') < 0) {
// Reload page with correct player
document.cookie = 'usingFlashV1=true;path=/';
document.cookie = 'usingHTML5V1=; expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
document.location.href = document.location.href;
}
// check if page actually has youtube info
if (unsafeWindow.jwplayer) {
USE_FLASH_FOR_PAGE = true;
YOUTUBE_FLASH_PLAYER = false;
} else if (unsafeWindow.myPlayer) {
USE_FLASH_FOR_PAGE = false;
YOUTUBE_FLASH_PLAYER = false;
} else {
USE_FLASH_FOR_PAGE = true;
YOUTUBE_FLASH_PLAYER = true;
}
} else {
if (document.cookie.indexOf('usingHTML5V1') < 0) {
// Reload page with correct player
document.cookie = 'usingFlashV1=; expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
document.cookie = 'usingHTML5V1=true;path=/';
document.location.href = document.location.href;
}
// check that page actually has html5 player
if (unsafeWindow.myPlayer) {
USE_FLASH_FOR_PAGE = false;
YOUTUBE_FLASH_PLAYER = false;
} else if (unsafeWindow.jwplayer) {
USE_FLASH_FOR_PAGE = true;
YOUTUBE_FLASH_PLAYER = false;
} else {
USE_FLASH_FOR_PAGE = true;
YOUTUBE_FLASH_PLAYER = true;
}
}
// Flash Player
if (USE_FLASH_FOR_PAGE) {
console.log('Using Flash Player');
if (YOUTUBE_FLASH_PLAYER) {
console.log('Using YouTube Player');
// Functions to inject on page for flash video control
// Fires when youtube player is ready
var onYouTubePlayerReady = function(playerId) {
console.log('Youtube Player Custom Controls Initialized');
if (pause_option) {
embedVideo.pauseVideo();
}
embedVideo.addEventListener('onStateChange', 'check_for_end');
// translate option into youtubes quality strings values
var youtube_quality_option;
if (quality_option == '1080') {
youtube_quality_option = 'hd1080';
} else if (quality_option == '720') {
youtube_quality_option = 'hd720';
} else if (quality_option == '480') {
youtube_quality_option = 'large';
} else if (quality_option == '360') {
youtube_quality_option = 'medium';
}
// set the quality
embedVideo.setPlaybackQuality(youtube_quality_option);
// set the volume
embedVideo.setVolume(volume_control);
// focus on the video (so pressing f will fullscreen)
setTimeout('embedVideo.focus();', 0);
// Force position to be absolute (compatibility with 'Turn Off the Lights')
setTimeout(function() {
if (embedVideo.style.cssText.indexOf("position: relative !important") >= 0) {
embedVideo.style.cssText = embedVideo.style.cssText.substr(0, embedVideo.style.cssText.indexOf("position: relative !important;")) + embedVideo.style.cssText.substr(embedVideo.style.cssText.indexOf("position: relative !important") + 30);
}
}, 100);
}
// Check for end of playback and move to next video
var check_for_end = function(state) {
if (state == 0 && autoplay_option && autoplay_count != 0) {
if (autoplay_count > 0) {
autoplay_count--;
if (autoplay_count == 0) {
autoplay_count = -1;
autoplay_option = false;
}
document.dispatchEvent(update_userscript);
}
var button = document.getElementById('btnNext');
if (button) {
var link = button.parentElement;
document.location.href = link.href;
}
}
}
// Create script to inject
var script2 = document.createElement('script');
script2.type = "text/javascript";
script2.innerHTML = 'var onYouTubePlayerReady = ' + onYouTubePlayerReady.toString() + '\n' +
'var check_for_end = ' + check_for_end.toString() + '\n' +
'var pause_option = ' + pause_option.toString() + '\n' +
'var quality_option = "' + quality_option.toString() + '"\n' +
'var autoplay_option = ' + autoplay_option.toString() + '\n' +
'var autoplay_count = ' + autoplay_count.toString() + '\n' +
'var volume_control = ' + volume_control.toString() + '\n' +
'var update_userscript = new Event("UDUS")';
// Inject the script
document.getElementsByTagName('head')[0].appendChild(script2);
// Update values for userscript before switching to next video
document.addEventListener('UDUS', function(event) {
autoplay_count = unsafeWindow.autoplay_count;
autoplay_option = unsafeWindow.autoplay_option;
GM_setValue("auto", autoplay_option);
GM_setValue("auto_count", autoplay_count);
});
}
else {
console.log('Using jwplayer.');
// Functions to inject on page for flash video control
// Fires when youtube player is ready
var flash_player_controls = function () {
// wait till video is loaded into player
jwplayer().onReady(function() {
console.log("jwplayer custom Controls Initialized");
// change the quality to desired flash option
var available_levels = jwplayer().getQualityLevels();
var level_set = false;
var desired_level = parseInt(quality_option);
// try to find exact quality level
for (var i = 0; i < available_levels.length; i++) {
if (desired_level == parseInt(available_levels[i].label)) {
jwplayer().setCurrentQuality(i);
level_set = true;
break;
}
}
// try to find best level alternate
if (!level_set) {
// check if desired level is lower than all available
if (desired_level < parseInt(available_levels[0].label)) {
jwplayer().setCurrentQuality(0);
}
// check if desired level is higher than all available
else if(desired_level > parseInt(available_levels[available_levels.length - 1].label)) {
jwplayer().setCurrentQuality(available_levels.length - 1);
}
// else find level that is next smallest
else {
for (var i = 0; i < available_levels.length; i++) {
if(desired_level < parseInt(available_levels[i].label)) {
jwplayer().setCurrentQuality(i-1);
break;
}
}
}
}
// pause the video if option is enabled
if (pause_option) {
jwplayer().pause();
}
// settup callback for end of video checks
jwplayer().onComplete(check_for_end);
});
}
// Check for end of playback and move to next video
var check_for_end = function () {
var button = document.getElementById('btnNext');
if (button && autoplay_option && autoplay_count != 0) {
if (autoplay_count > 0) {
autoplay_count--;
if (autoplay_count == 0) {
autoplay_count = -1;
autoplay_option = false;
}
document.dispatchEvent(update_userscript);
}
var link = button.parentElement;
document.location.href = link.href;
}
}
// Create script to inject
var script2 = document.createElement('script');
script2.type = "text/javascript";
script2.innerHTML = 'var flash_player_controls = ' + flash_player_controls.toString() + '\n' +
'var check_for_end = ' + check_for_end.toString() + '\n' +
'var pause_option = ' + pause_option.toString() + '\n' +
'var quality_option = "' + quality_option.toString() + '"\n' +
'var autoplay_option = ' + autoplay_option.toString() + '\n' +
'var autoplay_count = ' + autoplay_count.toString() + '\n' +
'var update_userscript = new Event("UDUS")';
// Inject the script
document.getElementsByTagName('head')[0].appendChild(script2);
// call injected function, hopefully after jwplayer has been settup
setTimeout(function() {
unsafeWindow.flash_player_controls();
},500);
// Update values for userscript before switching to next video
document.addEventListener('UDUS', function(event) {
autoplay_count = unsafeWindow.autoplay_count;
autoplay_option = unsafeWindow.autoplay_option;
GM_setValue("auto", autoplay_option);
GM_setValue("auto_count", autoplay_count);
});
}
}
// HTML5 Player
else {
console.log('Using HTML5 Player');
// move quality select below player
var html_quality_select = document.getElementById('selectQuality');
if (html_quality_select) {
var video_area = document.getElementById('centerDivVideo');
var leftover_text = html_quality_select.parentElement;
var empty_div = document.createElement('div');
video_area.parentElement.insertBefore(html_quality_select, video_area.nextSibling);
video_area.parentElement.insertBefore(empty_div, video_area.nextSibling);
leftover_text.remove();
}
// Functions to inject on page for html5 video control
var html5_video_options = function() {
console.log("HTML5 Player custom Controls Initialized");
// change the quality to desired flash option
var available_levels = $('#selectQuality')[0];
var level_set = false;
var desired_level = parseInt(quality_option);
// try to find exact quality level
for (var i = 0; i < available_levels.length; i++) {
if (desired_level == parseInt(available_levels.options[i].innerHTML)) {
available_levels.selectedIndex = i;
$('#selectQuality').change();
$('.clsTempMSg').remove();
level_set = true;
break;
}
}
// try to find best level alternate
if (!level_set) {
// check if desired level is higher than all available
if (desired_level < parseInt(available_levels.options[available_levels.length - 1].innerHTML)) {
available_levels.selectedIndex = available_levels.length - 1;
$('#selectQuality').change();
$('.clsTempMSg').remove();
}
// check if desired level is lower than all available
else if (desired_level > parseInt(available_levels.options[0].innerHTML)) {
available_levels.selectedIndex = 0;
$('#selectQuality').change();
$('.clsTempMSg').remove();
}
// else find level that is next smallest
else {
for (var i = 0; i < available_levels.length; i++) {
if (desired_level > parseInt(available_levels.options[i].innerHTML)) {
available_levels.selectedIndex = i;
$('#selectQuality').change();
$('.clsTempMSg').remove();
}
}
}
}
if (pause_option) {
my_video_1_html5_api.pause();
}
my_video_1_html5_api.volume = volume_control / 100;
my_video_1_html5_api.addEventListener('ended', html5_video_end);
}
var html5_video_end = function() {
var button = document.getElementById('btnNext');
if (button && autoplay_option && autoplay_count != 0) {
if (autoplay_count > 0) {
autoplay_count--;
if (autoplay_count == 0) {
autoplay_count = -1;
autoplay_option = false;
}
document.dispatchEvent(update_userscript);
}
var link = button.parentElement;
document.location.href = link.href;
}
}
// injected speed controls
var playback_decrease = function() {
my_video_1_html5_api.playbackRate -= 0.25;
}
var playback_increase = function() {
my_video_1_html5_api.playbackRate += 0.25;
}
// Create script to inject
var script2 = document.createElement('script');
script2.type = "text/javascript";
script2.innerHTML = 'var html5_video_options = ' + html5_video_options.toString() + '\n' +
'var html5_video_end = ' + html5_video_end.toString() + '\n' +
'var pause_option = ' + pause_option.toString() + '\n' +
'var quality_option = ' + quality_option.toString() + '\n' +
'var autoplay_option = ' + autoplay_option.toString() + '\n' +
'var autoplay_count = ' + autoplay_count.toString() + '\n' +
'var playback_decrease = ' + playback_decrease.toString() + '\n' +
'var playback_increase = ' + playback_increase.toString() + '\n' +
'var volume_control = ' + volume_control.toString() + '\n' +
'var update_userscript = new Event("UDUS")';
// Inject the script
document.getElementsByTagName('head')[0].appendChild(script2);
// Call the injected script
unsafeWindow.html5_video_options();
// Update values for userscript before switching to next video
document.addEventListener('UDUS', function(event) {
autoplay_count = unsafeWindow.autoplay_count;
autoplay_option = unsafeWindow.autoplay_option;
GM_setValue("auto", autoplay_option);
GM_setValue("auto_count", autoplay_count);
});
// remove extra (ghost) vjs-tip
setInterval(function() {
$(document.querySelectorAll('#vjs-tip')).slice(1).remove();
}, 500);
// key listener
window.addEventListener('keydown', function(e) {
if (e.code === 'NumpadMultiply' && $('#btnPrevious').length) { /* previous episode */
console.log('Skipping to previous episode');
$('#btnPrevious').click();
e.preventDefault();
} else if (e.code === 'NumpadSubtract' && $('#btnNext').length) { /* next episode */
console.log('Skipping to next episode');
$('#btnNext').click();
e.preventDefault();
}
if (e.ctrlKey) { /* ctrl key for 20s skip */
if (e.code === 'ArrowLeft') { /* back 20s */
my_video_1_html5_api.currentTime -= 20;
e.preventDefault();
} else if (e.code === 'ArrowRight') { /* forward 20s */
my_video_1_html5_api.currentTime += 20;
e.preventDefault();
}
}
});
}
// Scroll to the Container
if (autoscroll_option) {
document.getElementById('container').scrollIntoView(true);
}
var resize_video_area = function() {
if (fake_fullscreen) {
var resize_width = window.innerWidth;
var resize_height = window.innerHeight;
document.getElementById('container').style.width = "" + (resize_width) + "px";
document.getElementById('adsIfrme').style.width = "" + (resize_width) + "px";
$(".barContent")[0].children[0].style.width = "" + (resize_width) + "px";
document.getElementById('centerDivVideo').style.width = "" + (resize_width) + "px";
document.getElementById('centerDivVideo').style.height = "" + (resize_height) + "px";
if (USE_FLASH_FOR_PAGE) {
document.getElementById('divContentVideo').style.width = "" + (resize_width) + "px";
document.getElementById('divContentVideo').style.height = "" + (resize_height) + "px";
document.getElementById('embedVideo').style.width = "" + (resize_width) + "px";
document.getElementById('embedVideo').style.height = "" + (resize_height) + "px";
} else {
document.getElementById('divContentVideo').style.width = "" + (resize_width) + "px";
document.getElementById('divContentVideo').style.height = "" + (resize_height) + "px";
document.getElementById('my_video_1').style.width = "" + (resize_width) + "px";
document.getElementById('my_video_1').style.height = "" + (resize_height) + "px";
}
var seek_bar = $('.vjs-control-bar');
if (seek_bar.length > 0) {
seek_bar[0].style.visibility = 'hidden';
}
document.getElementById('centerDivVideo').scrollIntoView(true);
document.body.style.overflow = 'hidden';
}
else {
var resize_to = window.innerWidth - 30;
if (resize_to > 970) {
resize_to = 970;
}
document.getElementById('container').style.width = "" + (resize_to) + "px";
document.getElementById('adsIfrme').style.width = "" + (resize_to - 20) + "px";
$(".barContent")[0].children[0].style.width = "" + (resize_to - 40) + "px";
document.getElementById('centerDivVideo').style.width = "" + (resize_to - 40) + "px";
document.getElementById('centerDivVideo').style.height = "" + (resize_to - 40) * 552 / 845 + "px";
if (USE_FLASH_FOR_PAGE) {
document.getElementById('divContentVideo').style.width = "" + (resize_to - 40) + "px";
document.getElementById('divContentVideo').style.height = "" + (resize_to - 40) * 552 / 845 + "px";
document.getElementById('embedVideo').style.width = "" + (resize_to - 40) + "px";
document.getElementById('embedVideo').style.height = "" + (resize_to - 40) * 552 / 845 + "px";
} else {
document.getElementById('divContentVideo').style.width = "" + (resize_to - 40) + "px";
document.getElementById('divContentVideo').style.height = "" + (resize_to - 40) * 552 / 845 + "px";
document.getElementById('my_video_1').style.width = "" + (resize_to - 40) + "px";
document.getElementById('my_video_1').style.height = "" + (resize_to - 40) * 552 / 845 + "px";
}
var seek_bar = $('.vjs-control-bar');
if (seek_bar.length > 0) {
seek_bar[0].style.visibility = 'visible';
}
document.body.style.overflow = 'visible';
}
}
if (resize_option) {
window.addEventListener("resize", resize_video_area);
// wait some for vid to get added to page, and initialy resize it
setTimeout(function() {
resize_video_area();
}, 1000);
}
// Keys listener for navigating between episodes with left and right arrow keys
// Arrow key keycodes
var LEFT_ARROW_KEY = 37;
var RIGHT_ARROW_KEY = 39;
var MINUS_DASH_KEY = 173;
var PLUS_EQUALS_KEY = 61;
var BAR_FORWARD_SLASH_KEY = 220;
var key_listener = function(event) {
// Get which key is pressed
var key_pressed = event.which;
if (arrow_key_navagation) {
// check to make sure video isnt playing
if ((USE_FLASH_FOR_PAGE && YOUTUBE_FLASH_PLAYER && unsafeWindow.embedVideo.getPlayerState() == 2) || (USE_FLASH_FOR_PAGE && !YOUTUBE_FLASH_PLAYER && unsafeWindow.jwplayer().getState() == "PAUSED")
|| (!USE_FLASH_FOR_PAGE && my_video_1_html5_api.paused)) {
// Left arrow key to go to previous video
if (key_pressed == LEFT_ARROW_KEY) {
var button = document.getElementById('btnPrevious');
if (button) {
var link = button.parentElement;
document.location.href = link.href;
}
// Prevent Default Action of scrolling
event.preventDefault();
}
// right arrow key for next video
else if (key_pressed == RIGHT_ARROW_KEY) {
var button = document.getElementById('btnNext');
if (button) {
var link = button.parentElement;
document.location.href = link.href;
}
// Prevent Default Action of scrolling
event.preventDefault();
}
}
}
// Speed controls for HTLM5 player (flash doesn't support atm)
if (speed_control && !USE_FLASH_FOR_PAGE) {
if (key_pressed == MINUS_DASH_KEY && unsafeWindow.my_video_1_html5_api.playbackRate > 0.25) {
unsafeWindow.playback_decrease();
}
if (key_pressed == PLUS_EQUALS_KEY && unsafeWindow.my_video_1_html5_api.playbackRate < 5) {
unsafeWindow.playback_increase();
}
}
if (key_pressed == BAR_FORWARD_SLASH_KEY) {
fake_fullscreen = !fake_fullscreen;
GM_setValue('fake_fullscreen', fake_fullscreen);
resize_video_area();
}
}
// Add the listener for keypresses
document.addEventListener("keydown", key_listener);
console.log('Done!');
}
//---------------------------------------------------------------------------------------------------------------
// Clean All pages
//---------------------------------------------------------------------------------------------------------------
console.log('Performing Cleaning for All Pages')
// Remove share stuff next to search bar
// Get the search element near the top of the page
var search = document.getElementById('search');
// If it exist then proceed to remove the child that is the facebook, share stuff next to it
if (search) {
search.children[0].children[2].remove();
}
// Remove Login at the top of the page
if (remove_login) {
var login = document.getElementById('topHolderBox');
if (login) {
login.remove();
}
}
// Remove Tabs I don't Use
var mobile = document.getElementById('liMobile');
if (mobile) {
mobile.remove();
}
var report_error = document.getElementById('liReportError');
if (report_error) {
report_error.remove();
}
var request_anime = document.getElementById('liRequest');
if (request_anime) {
request_anime.remove();
}
var forum = document.getElementById('liCommunity');
if (forum) {
forum.remove();
}
var faq = document.getElementById('liFAQ');
if (faq) {
faq.remove();
}
var manga = document.getElementById('liReadManga');
if (manga) {
manga.remove();
}
// Remove Footer
var footer = document.getElementById('footer');
if (footer) {
footer.remove();
}
// Remove 'random' hides that appear on the sides of the page, all pages
if ($('div.divCloseBut')) {
$('div.divCloseBut').remove();
}
// Keys listener for Script Menu Options
// Home Key Code
var HOME_KEY = 36;
var menu_open = false;
var menu;
var global_key_listener = function(event) {
// Get which key is pressed
var key_pressed = event.which;
if (key_pressed == HOME_KEY) {
// Prevent Default Action of scrolling to top of page
event.preventDefault();
open_menu();
}
}
var open_menu = function() {
if (!menu_open) {
menu_open = true;
// Make div element for menu
menu = document.createElement('div');
menu.id = 'cleaner-options';
menu.style.cssText = 'color:black;width:250px;height:320px;background-color:white;position:fixed;top:0;bottom:0;left:0;right:0;margin:auto;border:5px solid;border-radius:10px;border-color:#7FCA03;padding:10px;z-index:5;';
menu.innerHTML = '<center><b>KissAnime Cleaner Options</b></center>' +
'<form><input style="margin:2px;" type="checkbox" name="pause" value="true" id="pause_option_box"> Pause Videos on Page Load <br>' +
'<input style="margin:2px;" type="checkbox" name="autoplay" value="true" id="autoplay_option_box"> Automatically Play Next <input style="margin:0px;font-size:111%;font-family:Tahoma,Arial,Helvetica,sans-serif;" type="number" name="autoplaycount" id="autoplay_count" min="-1" max="999"> Video(s) (choose -1 to play all)<br>' +
'<input style="margin:2px;" type="checkbox" name="autoscroll" value="true" id="autoscroll_option_box"> Automatically Scroll Down to Video Area <br>' +
'<input style="margin:2px;" type="checkbox" name="resize" value="true" id="resize_option_box"> Resize Video Area <br>' +
'<input style="margin:2px;" type="checkbox" name="arrow_nav" value="true" id="arrow_nav_box"> Arrow Keys Navigate Between Videos <br>' +
'<input style="margin:2px;" type="checkbox" name="speed_playback" value="true" id="playback_speed_control_box"> Enable HTML5 Playback speed controls <br>' +
'<input style="margin:2px;" type="checkbox" name="remove_login" value="true" id="remove_login_box"> Disable Login <br>' +
'<input style="margin:2px;" type="checkbox" name="remove_comments" value="true" id="remove_comments_box"> Disable Comments <br><br>' +
'<center><b>Player Options</b></center>' +
'<table style="width: 100%;border-collapse:separate;border-spacing:2px;"><tr><td><input style="margin:2px;" type="radio" name="player" value="flash" id="flash_option"> Flash Player</td>' +
'<td align="right"><select style="margin:2px;" id="quality_select">' +
'<option value="360">360p</option>' +
'<option value="480">480p</option>' +
'<option value="720">720p</option>' +
'<option value="1080">1080p</option>' +
'</select></td></tr>' +
'<tr><td><input style="margin:2px;" type="radio" name="player" value="html5" id="html5_option"> HTML5 Player</td>' +
'<td align="right">Volume <input style="margin:0px;font-size:111%;font-family:Tahoma,Arial,Helvetica,sans-serif;" type="number" name="volumepercent" id="volume_percent" min="0" max="100"></td></tr></table>' +
'<center><input style="margin:2px;font-size:111%;font-family:Tahoma,Arial,Helvetica,sans-serif;padding:2px 5px 2px 5px;width:44px;height:27px;line-height:3px;" type="button" value="Save" id="menu_sumbit_button"></center></form>';
// Add menu to page
document.getElementById('containerRoot').appendChild(menu);
// Set menus starting options to current values
// Checkboxes
var pause_option_box = document.getElementById('pause_option_box');
if (pause_option) {
pause_option_box.checked = true;
}
var autoplay_option_box = document.getElementById('autoplay_option_box');
if (autoplay_option) {
autoplay_option_box.checked = true;
}
var resize_option_box = document.getElementById('resize_option_box');
if (resize_option) {
resize_option_box.checked = true;
}
var autoplay_count_input = document.getElementById('autoplay_count');
autoplay_count_input.style.width = '40px';
autoplay_count_input.value = autoplay_count;
var autoscroll_option_box = document.getElementById('autoscroll_option_box');
if (autoscroll_option) {
autoscroll_option_box.checked = true;
}
var arrow_nav_box = document.getElementById('arrow_nav_box');
if (arrow_key_navagation) {
arrow_nav_box.checked = true;
}
var playback_speed_control_box = document.getElementById('playback_speed_control_box');
if (speed_control) {
playback_speed_control_box.checked = true;
}
var remove_login_box = document.getElementById('remove_login_box');
if (remove_login) {
remove_login_box.checked = true;
}
var remove_comments_box = document.getElementById('remove_comments_box');
if (remove_comments) {
remove_comments_box.checked = true;
}
// Player radios
var flash_option = document.getElementById('flash_option');
var html5_option = document.getElementById('html5_option');
if (player_option == PLAYER_FLASH) {
if (flash_option) {
flash_option.checked = true;
}
} else if (player_option == PLAYER_HTML5) {
if (html5_option) {
html5_option.checked = true;
}
}
// Quality select
var quality_select = document.getElementById('quality_select');
if (quality_select) {
quality_select.value = quality_option;
}
var volume_percent_input = document.getElementById('volume_percent');
volume_percent_input.style.width = '40px';
volume_percent_input.value = volume_control;
// Get the save button
var submit_button = document.getElementById('menu_sumbit_button');
// Save the values and close the menu
submit_button.onclick = menu_save;
} else {
menu_save();
}
}
var menu_save = function() {
// Get all of the form choices for checking
var pause_option_box = document.getElementById('pause_option_box');
var autoplay_option_box = document.getElementById('autoplay_option_box');
var autoplay_count_input = document.getElementById('autoplay_count');
var autoscroll_option_box = document.getElementById('autoscroll_option_box');
var resize_option_box = document.getElementById('resize_option_box');
var flash_option = document.getElementById('flash_option');
var html5_option = document.getElementById('html5_option');
var quality_select = document.getElementById('quality_select');
var arrow_nav_box = document.getElementById('arrow_nav_box');
var playback_speed_control_box = document.getElementById('playback_speed_control_box');
var volume_percent_input = document.getElementById('volume_percent');
var remove_login_box = document.getElementById('remove_login_box');
var remove_comments_box = document.getElementById('remove_comments_box');
// Update Greasemonkey stored values for options
GM_setValue("pause", pause_option_box.checked);
GM_setValue("auto", autoplay_option_box.checked);
GM_setValue("scroll", autoscroll_option_box.checked);
GM_setValue("auto_count", parseInt(autoplay_count_input.value));
GM_setValue("resize", resize_option_box.checked);
GM_setValue("arrow_nav", arrow_nav_box.checked);
GM_setValue("quality", quality_select.value);
GM_setValue("speed_control", playback_speed_control_box.checked);
GM_setValue("volume_control", volume_percent_input.value);
GM_setValue("remove_login", remove_login_box.checked);
GM_setValue("remove_comments", remove_comments_box.checked);
// Check which player option is checked
if (flash_option.checked) {
// Update greasemonkey stored value
GM_setValue("player", PLAYER_FLASH);
// Set appropriate cookies
document.cookie = 'usingFlashV1=true;path=/';
document.cookie = 'usingHTML5V1=; expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
// Reload page if value has changed
if (player_option != PLAYER_FLASH && video_page.test(url)) {
document.location.href = document.location.href;
}
player_option = PLAYER_FLASH;
} else if (html5_option.checked) {
// Update greasemonkey stored value
GM_setValue("player", PLAYER_HTML5);
// Set appropriate cookies
document.cookie = 'usingFlashV1=; expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
document.cookie = 'usingHTML5V1=true;path=/';
// Reload page if value has changed
if (player_option != PLAYER_HTML5 && video_page.test(url)) {
document.location.href = document.location.href;
}
player_option = PLAYER_HTML5;
}
// Update this pages userscript options
pause_option = pause_option_box.checked;
autoplay_option = autoplay_option_box.checked;
autoscroll_option = autoscroll_option_box.checked;
arrow_key_navagation = arrow_nav_box.checked;
autoplay_count = parseInt(autoplay_count_input.value);
quality_option = quality_select.value;
speed_control = playback_speed_control_box.checked;
// Update unsafeWindow values that might matter if on video pages
if (video_page.test(url)) {
unsafeWindow.autoplay_option = autoplay_option_box.checked;
unsafeWindow.autoplay_count = parseInt(autoplay_count_input.value);
}
menu.remove();
menu_open = false;
}
// Add the listener for keypresses
document.addEventListener("keydown", global_key_listener);
// Also add as GM menu command
GM_registerMenuCommand("Options Menu", open_menu, "o");
// The search results
var search_results = document.getElementById('result_box');
// The search form text box
var search_form = document.getElementById('keyword');
// Current search selection, -1 if nothing
var search_selection = -1;
// used to scroll search results to current highlighted results
var scroll_height = 0;
// Interval for checking if any results match and appear
var navigation_interval;
// Used to count how many times results are checked for before giving up
var navigation_attempts;
// Key codes
var UP_ARROW_KEY = 38;
var DOWN_ARROW_KEY = 40;
var ENTER_KEY = 13;
// Prevent up and down arrow keys from causing the results to refresh
var prevent_key_reg = function(event) {
var key_pressed = event.which;
if (key_pressed == UP_ARROW_KEY || key_pressed == DOWN_ARROW_KEY) {
event.stopPropagation();
}
}
// Add above in the capture phase of event propagation, so it happens first
document.addEventListener('keyup', prevent_key_reg, true);
// Intercept Enter key press to check if anything is selected
var go_to_selection = function(event) {
var key_pressed = event.which;
if (key_pressed == ENTER_KEY) {
// Check if anything is selected
if (search_selection >= 0 && search_selection < search_results.childElementCount) {
// Go to selection
document.location.href = search_results.children[search_selection].href;
// Prevent form submission
event.preventDefault();
}
}
}
document.addEventListener('keydown', go_to_selection);
// Navigate up and down in search results
var navigate_search_results = function(event) {
var key_pressed = event.which;
if (key_pressed == UP_ARROW_KEY) {
if (search_selection > 0) {
search_results.children[search_selection].style.backgroundColor = '';
search_results.children[--search_selection].style.backgroundColor = '#565E66';
scroll_height -= search_results.children[search_selection + 1].clientHeight;
if (search_selection == 0) {
scroll_height = 0;
}
search_results.scrollTop = scroll_height;
}
}
if (key_pressed == DOWN_ARROW_KEY) {
if (search_selection < search_results.childElementCount - 1) {
if (search_selection >= 0) {
search_results.children[search_selection].style.backgroundColor = '';
}
search_results.children[++search_selection].style.backgroundColor = '#565E66';
scroll_height += search_results.children[search_selection - 1].clientHeight;
search_results.scrollTop = scroll_height;
}
}
}
// Checks if there are navigatable results and adds navigate listener
var reset_navigation = function() {
search_selection = -1;
scroll_height = 0;
++navigation_attempts;
if (search_results.childElementCount > 0) {
document.addEventListener('keydown', navigate_search_results);
clearInterval(navigation_interval);
} else {
document.removeEventListener('keydown', navigate_search_results);
if (navigation_attempts >= 10) {
clearInterval(navigation_interval);
}
}
}
// Called everytime search text box input changes to see if there is navigatable results
var try_navigation = function() {
clearInterval(navigation_interval);
navigation_attempts = 0;
navigation_interval = setInterval(reset_navigation, 200);
}
search_form.addEventListener('input', try_navigation);
console.log('Done!');
@crapier
Copy link

crapier commented Nov 8, 2016

Thanks for keeping the script updated, I haven't been (and probably wont be) updating it for the foreseeable future. For a few reasons, including school schedule and general less interest in anime recently.

Feel free to keep updating this and to point others towards your own gist instead of mine.

I do have one final contribution that had been bothering me for a while though (no new feature). I redid the regular expression to be much more concise, feel free to use this:

var home = /https?:\/\/(kissanime\.to|kisscartoon\.me|kissasian\.com)\/$/;
var anime_list = /https?:\/\/(kissanime\.to|kisscartoon\.me|kissasian\.com)\/(AnimeList|Genre|Status|Search|UpcomingAnime|CartoonList|DramaList|Country)/;
var anime_page = /https?:\/\/(kissanime\.to|kisscartoon\.me|kissasian\.com)\/(Anime|Cartoon|Drama)\/[^\/]*$/;
var video_page = /https?:\/\/(kissanime\.to|kisscartoon\.me|kissasian\.com)\/(Anime|Cartoon|Drama)\/[^\/]*\/[^\/]*\?id=\n*/;

It should work...

@Juici
Copy link
Author

Juici commented Nov 8, 2016

@crapier Yeah, thanks I didn't really bother with it until now, because I didn't see any issues 😄

Copy link

ghost commented Mar 17, 2017

Kissanime recently got updated and when playing a video the cleaner options aren't working, auto scroll, quality selector and other things etc. Please fix it asap thanks a lot.

@Juici
Copy link
Author

Juici commented Mar 17, 2017

@TK17 I am aware of this thanks for the report! Please check out the script here for future reference https://github.com/Juici/KissCleaner

@Juici
Copy link
Author

Juici commented Mar 17, 2017

@TK17 this issue has been fixed Juici/KissCleaner@c73c69f

Copy link

ghost commented Mar 18, 2017

@Juici I'm now using kisscleaner and the options are much cleaner, overall experience is great. Thanks a lot

@ghubbesto
Copy link

Comment True doesnt work inside video/episode.
I tried to remove all comment codes, but doesnt help too.

@Juici
Copy link
Author

Juici commented Mar 18, 2017

@ghubbesto
Would you mind trying with the newer version here: https://github.com/Juici/KissCleaner
If you still have problems please detail them as best you can, with screenshots too if possible at https://github.com/Juici/KissCleaner/issues

Thanks.

@ghubbesto
Copy link

@Juici
http://i.imgur.com/vJk4ShW.jpg This one is OK, but
http://i.imgur.com/QFsZvHn.jpg This one is NOT.

I did delete my current one, and redownload the new one. Then go to settings, and then tick the remove comment, and then save. Then reopen the page/any page with video.

@Juici
Copy link
Author

Juici commented Mar 19, 2017

@ghubbesto created an issue here Juici/KissCleaner#6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment