AzLyrics +

Adds some extra functions to AzLyrics, changes theme and removes adds

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name	AzLyrics +
// @description Adds some extra functions to AzLyrics, changes theme and removes adds
// @version     2.0.0
// @author      Bekir Uzun
// @namespace   https://greasyfork.org/en/scripts/21458-azlyrics
// @match       http://www.azlyrics.com/*
// @run-at      document-start
// @license     https://creativecommons.org/licenses/by-sa/4.0/
// @icon        https://raw.githubusercontent.com/BekirUzun/AzLyricsPlus/master/az_lyrics_plus_logo.png
// @homepage	https://github.com/BekirUzun/AzLyricsPlus
// @supportURL  https://github.com/BekirUzun/AzLyricsPlus/issues
// @require     https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js
// @grant       GM_addStyle
// @grant   	GM_setValue
// @grant   	GM_getValue
// @grant   	GM_deleteValue
// @grant   	GM_listValues
// @grant   	unsafeWindow
// ==/UserScript==
/*jshint multistr: true, newcap: false */
(function() {
	'use strict';

	// disable script in Iframes
	if (window.self!==window.top) { return; }

	var initial_settings = {
		"light_mode": false,
		"font_size": 30,
		"block_ads": true,
		"background":{
			"type":"color",
			"shadow": true,
			"filter": "none",
			"image":"http://s21.postimg.org/klu7ak9mt/image.jpg",
			"video":"https://zippy.gfycat.com/AdvancedReasonableAbyssiniancat.mp4",
			"filters":[
				"none",
				"grayscale(70%)",
				"grayscale(100%) blur(3px)",
				"grayscale(50%) blur(5px) brightness(70%)"
			],
			"images": [
				"https://s10.postimg.org/cfo4eg5mx/image.jpg",
				"https://s21.postimg.org/qb8bgmy91/image.jpg",
				"https://s12.postimg.org/783o9ixmj/image.jpg",
				"https://s21.postimg.org/klu7ak9mt/image.jpg"
			],
			"videos": ["https://zippy.gfycat.com/AdvancedReasonableAbyssiniancat.mp4",
					   "https://giant.gfycat.com/PartialSlowIriomotecat.mp4",
					   "https://giant.gfycat.com/BestUncomfortableBagworm.mp4"
					  ]
		}, "colors": {
			"font":"#FFFFFF",
			"font_glow":"#0000FF",
			"bold_font_glow":"#00FFFF",
			"link_glow":"#FF0000",
			"background":"#000000"
		}
	};
	var settings = GM_getValue("settings", JSON.stringify(initial_settings));
	settings = JSON.parse(settings);

	var duration, duration_copy, path;

	function calculateDuration() {
		var dur, lines, height;
		height = $("#addsong").offset().top - window.innerHeight - settings.font_size * 1.4 * 2 ;
		lines = height / ( settings.font_size * 1.4 );
		dur = (lines * 5 ).toFixed(1);
		console.log( height, lines, dur );
		if (lines < 0)
			dur = 0.5;
		return dur;
	}

	function reCalculateDuration() {
		duration = duration_copy - ($( document ).scrollTop() / (settings.font_size * 1.4 )) * 5;
		if (duration <= 0.5)
			duration = 0.5;
		document.getElementById("duration").value = duration.toFixed(1);
	}

	function saveSettings() {
		settings.font_size = document.getElementById("font-size").value;
		settings.colors.font = document.getElementById("font-color").value;
		settings.colors.font_glow = document.getElementById("font-glow-color").value;
		settings.colors.link_glow = document.getElementById("link-glow-color").value;
		settings.colors.bold_font_glow = document.getElementById("bold-font-glow-color").value;
		settings.background.type = document.getElementById("background-type").value;
		settings.background.filter = document.getElementById("background-filter").value;

		if(document.getElementById("background-type").value == "color" )
			settings.colors.background = document.getElementById("background-color").value;
		else if(document.getElementById("background-type").value == "image" )
			settings.background.image = document.getElementById("background-image").value;
		else if(document.getElementById("background-type").value == "video" )
			settings.background.video = document.getElementById("background-video").value;

		if (document.getElementById("duration").value != duration) {
			duration = document.getElementById("duration").value;
			GM_setValue(path, duration);
		}
		settings.background.shadow = document.getElementById("bg-shadow").checked;
		settings.block_ads = document.getElementById("block-ads").checked;

		setTimeout( function() { // delayed this part because it temporarily fixed code. Some one fix this please :O
			if(document.getElementById("light-mode").checked != settings.light_mode) {
				if(document.getElementById("light-mode").checked){
					GM_setValue("settings_old", JSON.stringify(settings)); // save old settings
					settings.background.shadow = false;
					settings.background.filter = "none";
					settings.background.type = "color";
					settings.light_mode = true;
				} else {
					var settings_old = GM_getValue("settings_old", JSON.stringify(initial_settings));
					settings = JSON.parse(settings_old);
					GM_deleteValue("settings_old");
				}
			}
			GM_setValue("settings", JSON.stringify(settings));
		}, 100);
	}

	function resetEverything() {
		var keys = GM_listValues();
		alert(keys + keys.length);
		for (var i = 0; i < keys.length; i++) {
			GM_deleteValue(keys[i]);
		}
	}

	function resetSettings() {
		GM_deleteValue(path);
		GM_deleteValue("settings");
		GM_deleteValue("settings_old");
	}

	var css = '.main-page { width: 90%; font-size: ' + settings.font_size + 'px !important; color: ' + settings.colors.font + ' !important; letter-spacing: 1px !important; text-shadow: 0px 0px 5px ' + settings.colors.font_glow + ', 0px 0px 10px ' + settings.colors.font_glow + ', 0px 0px 15px ' + settings.colors.font_glow + ', 0px 0px 20px ' + settings.colors.font_glow + ', 0px 0px 30px ' + settings.colors.font_glow + ' !important;}\
body, .navbar-footer, .footer-wrap {background: rgba(0,0,0,0.8) !important; font-family: "Righteous", cursive !important; line-height: 1.4 !important;}\
.footer-wrap > .container > .noprint > img {filter: invert(100%) hue-rotate(195deg) saturate(300%);}\
body { background: ' + settings.colors.background + ' !important; }\
.main-page a {color: #FFF !important; text-shadow: 0px 0px 5px ' + settings.colors.link_glow + ', 0px 0px 10px ' + settings.colors.link_glow  + ', 0px 0px 15px ' + settings.colors.link_glow  + ', 0px 0px 20px ' + settings.colors.link_glow  + ', 0px 0px 30px ' + settings.colors.link_glow  + ' !important;}\
.main-page b {color: #FFF !important; text-shadow: 0px 0px 5px ' + settings.colors.bold_font_glow + ', 0px 0px 10px ' + settings.colors.bold_font_glow  + ', 0px 0px 15px ' + settings.colors.bold_font_glow + ', 0px 0px 20px ' + settings.colors.bold_font_glow + ', 0px 0px 30px ' + settings.colors.bold_font_glow + ' !important;}\
.navbar-default {background-color: #55F !important; border-color: #66F !important;}\
.comment { color: ddd !important}\
.btn-menu, .btn-primary { background-color: #00F !important; border-color: #00A !important; margin: 1px !important;}\
.btn-default, .breadcrumb, .panel.album-panel {background-color: #222 !important; border-color: #800 !important;}\
.btn.focus, .btn:focus, .btn:hover {background-color: #008 !important; border-color: #008 !important;}\
.lboard-wrap, .links-menu-wrap {background-color: #33D !important; padding-bottom: 10px !important; position: relative; z-index: 5; }\
@font-face {font-family: "Righteous"; font-style: normal; font-weight: 400; src: local("Righteous"), local("Righteous-Regular"), url(https://fonts.gstatic.com/s/righteous/v5/w5P-SI7QJQSDqB3GziL8XVtXRa8TVwTICgirnJhmVJw.woff2) format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;}\
.settings { box-shadow: 0px 0px 10px rgba(0,0,0,0.7); font-size: 12pt; width: 25em; position: fixed; top: 0px; right: 0px; background: #21B262; color: #ffffff; height: 100%; z-index: 99995; font-family: "Open Sans", Helvetica, sans-serif;  display: none; padding: 30px 20px 10px 20px;}\
.settings table {width: 100%;}\
.settings td {padding: 3px 5px 3px 5px; line-height: 1.5em;}\
.settings td:nth-child(even) { text-align: center; }\
.settings tr:nth-child(even){ background: rgba(0,0,0,0.1); }\
.settings td.buttons { width: 50%; padding: 5px 20px 5px 20px; }\
.settings button {background-color: #ed4933; box-shadow: none !important; width: 90%; height: 1.5em; color: #fff; font-family: "Open Sans", Helvetica, sans-serif;	font-size: 14pt; font-weight: 400; letter-spacing: 0.1em; border: none; cursor: pointer;}\
.settings input, .settings select {font-size: 12pt; color: #fff; font-family: "Open Sans", Helvetica, sans-serif; line-height: 1.5em; height: 1.5em; background: rgba(100, 100, 100, 0.25); border: none; padding: 0em 0em 0em 0.3em; text-decoration: none; width: 100px; }\
.settings input[type="color"] {background: rgba(0, 0, 0, 0); height: 1.5em; border: none; padding: 0em; position: relative;}\
.settings input[type="checkbox"]:checked + label:before { background: #0F0; color: #fff; content: "✔";}\
.settings input[type="checkbox"] + label:before { background: rgba(150,178,150,1);  content: "X"; color: rgba(150,178,150,1); display: inline-block; height: 1.5em; line-height: 1.5em; text-align: center; width: 1.5em; }\
.settings input[type="checkbox"] { -moz-appearance: none; -webkit-appearance: none; appearance: none; display: block; float: left; margin-right: -2em; opacity: 0; width: 1em; z-index: -1;}\
.settings label {margin: 0 !important;}\
.pre-defined { width: initial !important; margin-right: 5px;}\
.closeSettings {position: fixed; top:0px; right:0px; background-image: url("http://bekiruzun.com/test/1/assets/css/images/close.svg"); background-repeat: no-repeat; background-position: 1em 1em; width: 3em; height: 2em; cursor: pointer;}\
.openSettings {position: fixed; top:0px; right:0px; background-image: url("https://raw.githubusercontent.com/BekirUzun/AzLyricsPlus/master/img/gear-icon.png"); background-size: 40px; background-repeat: no-repeat; background-position: 0px 10px; width: 50px; height:50px; z-index: 99990; cursor: pointer;}\
.start {position: fixed; top:50px; right:0px; background-image: url("https://raw.githubusercontent.com/BekirUzun/AzLyricsPlus/master/img/play-icon.png"); background-size: 40px; background-repeat: no-repeat; background-position: 0px 10px; width: 50px; height:50px; z-index: 99991; cursor: pointer;}\
.stop {position: fixed; top:50px; right:0px; background-image: url("https://raw.githubusercontent.com/BekirUzun/AzLyricsPlus/master/img/stop-icon.png"); background-size: 40px; background-repeat: no-repeat; background-position: 0px 10px; width: 50px; height:50px; z-index: 99990; cursor: pointer;}';

	var html = {
		"bg_inputs":['<td>Background Color:</td><td><input id="background-color" type="color" value="' + settings.colors.background + '"></td>',
					 '<td>Background Image Url:</td><td><select id="pre-defined-images" class="pre-defined"><option value="0">1</option><option value="1">2</option><option value="2">3</option></select><input id="background-image" type="text" value="' + settings.background.image + '"></td>',
					 '<td>Background Video Url:</td><td><select id="pre-defined-videos" class="pre-defined"><option value="0">1</option><option value="1">2</option><option value="2">3</option></select><input id="background-video" type="text" value="' + settings.background.video + '"></td>'],
		"bg_type_select": "",
		"bg_input":"",
		"bg":"",
		"bg_shadow":"",
		"light_mode":"",
		"pre_defined":'<option value="0">1</option><option value="1">2</option><option value="2">3</option>'};

	if(settings.block_ads){
		css += '.ringtone, .addthis_toolbox.addthis_default_style:first-child, .sky-ad, .top-ad, .fb-like, #cf_fb_id, .col-xs-12.col-lg-8.text-center > .noprint.hidden-xs, .col-xs-12.col-lg-8.text-center > div:nth-child(2) { display: none !important; width: 0px !important; height: 0px !important}';
	}

	if(settings.background.shadow){
		html.bg_shadow = '<input id="bg-shadow" name="bg-shadow" type="checkbox" checked><label for="bg-shadow"></label>';
		css += '.col-xs-12.col-lg-8.text-center { background: rgba(0,0,0,0.6) !important; box-shadow: 0 0 100px 100px rgba(0, 0, 0, 0.6) !important; }';
	} else
		html.bg_shadow = '<input id="bg-shadow" name="bg-shadow" type="checkbox"><label for="bg-shadow"></label>';

	if(settings.light_mode)
		html.light_mode = '<input id="light-mode" name="light-mode" type="checkbox" checked><label for="light-mode"></label>';
	else
		html.light_mode = '<input id="light-mode" name="light-mode" type="checkbox"><label for="light-mode"></label>';

	if(settings.block_ads)
		html.block_ads = '<input id="block-ads" name="block-ads" type="checkbox" checked><label for="block-ads"></label>';
	else
		html.block_ads = '<input id="block-ads" name="block-ads" type="checkbox"><label for="block-ads"></label>';

	if(settings.background.type == "color"){
		html.bg_type_select = '<select id="background-type"><option value="color" selected>Color</option> <option value="image">Image</option><option value="video">Video</option></select>';
		html.bg_input = html.bg_inputs[0];
	} else if(settings.background.type == "image"){
		css += '.bg-div { background: '+ settings.colors.background +' url('+ settings.background.image +') no-repeat fixed; background-size: cover; -webkit-filter: '+ settings.background.filter +'; -moz-filter: '+ settings.background.filter +'; filter: '+ settings.background.filter +'; position: fixed; top: 0px; left: 0px; width: 100%; height:100%; z-index: -10; }';
		html.bg = '<div class="bg-div"></div>';
		html.bg_type_select = '<select id="background-type"><option value="color">Color</option><option value="image" selected>Image</option><option value="video">Video</option></select>';
		html.bg_input = html.bg_inputs[1];
	} else if(settings.background.type == "video"){
		css += '#bg-vid { -webkit-filter: '+ settings.background.filter +'; -moz-filter: '+ settings.background.filter +'; filter: '+ settings.background.filter +'; position: fixed; top: 0px; left: 0px; width: 100%; z-index: -10; }';
		html.bg = '<video id="bg-vid" autoplay loop poster="true"><source data-ng-src="'+ settings.background.video +'" src="'+ settings.background.video +'"></video>';
		html.bg_type_select = '<select id="background-type"><option value="color">Color</option><option value="image">Image</option><option value="video" selected>Video</option></select>';
		html.bg_input = html.bg_inputs[2];
	}

	if (typeof GM_addStyle != "undefined") {
		GM_addStyle(css);
	} else if (typeof PRO_addStyle != "undefined") {
		PRO_addStyle(css);
	} else if (typeof addStyle != "undefined") {
		addStyle(css);
	} else {
		var node = document.createElement("style");
		node.type = "text/css";
		node.appendChild(document.createTextNode(css));
		var head = document.getElementsByTagName("head");
		if (head.length > 0) {
			head[0].appendChild(node);
		} else {
			document.documentElement.appendChild(node);
		}
	}

	//Thanks to Brock Adams @  http://stackoverflow.com/questions/26268816/how-to-get-a-greasemonkey-script-to-run-both-at-run-at-document-start-and-at-r#answer-26269087
	document.addEventListener("DOMContentLoaded", DOM_ContentReady);

	function DOM_ContentReady() {
		path = window.location.pathname;
		if (path.includes("lyrics")) {
			var holder = document.getElementsByTagName("h2")[0].getElementsByTagName("b")[0].innerHTML;
			var patharray = path.split("/");
			var artisturl = "/" + patharray[2].charAt(0) + "/" + patharray[2] + ".html";
			document.getElementsByTagName("h2")[0].innerHTML = '<a href="' + artisturl + '" ><font size="35px">' + holder + '</font></a>';
		}
		document.getElementsByClassName("pull-left")[0].src = 'https://raw.githubusercontent.com/BekirUzun/AzLyricsPlus/master/az_lyrics_plus_logo.png';
		
		var duration_interval = setInterval(function(){
			$('html, body').animate({
				scrollTop: 0
			}, {
				duration: 0,
				easing: 'linear',
				complete: function() {
					duration = GM_getValue(path, calculateDuration());
					if(duration > 0){
						duration_copy = duration;
						reCalculateDuration();
						clearInterval(duration_interval);
					}
				}
			});
		}, 250);

		var settingsOutterDiv = document.createElement('div');
		settingsOutterDiv.innerHTML =
			'<div class="settings"><table class="settings-table">\
			    <tbody>\
                    <tr><td>Duration (seconds):</td><td><input id="duration" type="number" step="10" value=""></td></tr>\
                    <tr><td>Font Size (px):</td><td><input id="font-size" type="number" value="' + settings.font_size + '"></td></tr>\
                    <tr><td>Font Color:</td><td><input id="font-color" type="color" value="' + settings.colors.font + '"></td></tr>\
                    <tr><td>Font Glow Color:</td><td><input id="font-glow-color" type="color" value="' + settings.colors.font_glow + '"></td></tr>\
                    <tr><td>Bold Font Glow Color:</td><td><input id="bold-font-glow-color" type="color" value="' + settings.colors.bold_font_glow + '"></td></tr>\
                    <tr><td>Link Glow Color:</td><td><input id="link-glow-color" type="color" value="' + settings.colors.link_glow + '"></td></tr>\
                    <tr><td>Background Type:</td><td>'+ html.bg_type_select +'</td></tr>\
                    <tr id="bg-input">'+ html.bg_input +'</tr>\
                    <tr><td>Background Shadow:</td><td>'+ html.bg_shadow +'</td></tr>\
                    <tr><td>Background Filters:</td><td><select id="pre-defined-filters" class="pre-defined"><option value="0">1</option><option value="1">2</option><option value="2">3</option><option value="3">4</option></select><input id="background-filter" type="text" value="' + settings.background.filter + '"></td></tr>\
                    <tr><td>Block Ads:</td><td>'+ html.block_ads +'</td></tr>\
                    <tr><td>Light Mode:</td><td>'+ html.light_mode +'</td></tr>\
                    <tr style="margin-top: 5px;"><td class="buttons"><button id="save" type="button">Save</button></td><td class="buttons"><button id="reset" type="button">Reset</button></td></tr>\
                </tbody></table> <a class="closeSettings"></a>\
            </div>\
            <a id="openSettings" class="openSettings" ></a> <a class="start"></a> <a class="stop">';
		document.body.appendChild(settingsOutterDiv);
		if(settings.background.type != "color"){
			$('body').prepend(html.bg);
		}
		/* TODO (maybe): Split lyrics into two containers
		setTimeout( function() {
            var lyrics = document.querySelector("body > div.container.main-page > div > div.col-xs-12.col-lg-8.text-center > div:nth-child(6)").outerHTML;
			lyrics = lyrics.replace(/(\r\n|\n|\r)/gm,"");
			var lyrics_array = lyrics.split("<br><br>");
			var left_html = '', right_html = '';
			for( var i = 0; i < lyrics_array.length; i++){
				if(i%2 === 0){
					left_html += lyrics_array[i] + '<br><br>';
				} else {
					right_html += lyrics_array[i] + '<br><br>';
				}
			}
			$("body > div.container.main-page > div > div.col-xs-12.col-lg-8.text-center > div:nth-child(6)").html('<div class="left">'+ left_html +'</div><div class="right">'+ right_html +'</div>');
        }, 250);
*/

		if(settings.background.type == "video")
			document.getElementById("bg-vid").playbackRate = 0.7;
		//I think adding this to the settings menu is not really necessary.
		//but if you want to, you can :')

		if ($.fn.jquery !== "undefined") {
			$('.openSettings').click(function() {
				reCalculateDuration();
				$(".settings").show(800);
			});
			$('.closeSettings').click(function() {
				reCalculateDuration();
				$(".settings").hide(500);
			});
			$('.main-page').click(function() {
				$(".settings").hide(500);
			});
			$('#save').click(function() {
				$('html, body').animate({
					scrollTop: 0
				}, {
					duration: 0,
					easing: 'linear',
					complete: function() {
						reCalculateDuration();
						setTimeout( function() {
							saveSettings();
							setTimeout( function() {
								window.location.reload(true); // page will reload after saveSettings() function done its job. look at line 114
							}, 200);
						}, 200);
					}
				});
			});
			$('#reset').click(function() {
				if (confirm("Do you really want to reset color settings on all pages and duration time on current page?") === true) {
					resetSettings();
					window.location.reload(true);
				}
			});
			$('.start').click(function() {
				$('.start').toggle();
				reCalculateDuration();
				var one_line_height = settings.font_size * 1.4;
				$('html, body').animate({
					scrollTop: $("#addsong").offset().top - window.innerHeight - (one_line_height * 2)
				}, {
					duration: duration * 1000,
					easing: 'linear',
					complete: function() {
						$(".start").show();
					}
				});
			});
			$(".stop").click(function() {
				$(".start").toggle();
				$('html, body').stop();
				reCalculateDuration();
			});
			$("#background-type").change(function() {
				var selected = $("#background-type option:selected").val();
				if (selected == "color"){
					$("#bg-input").html(html.bg_inputs[0]);
				} else if (selected == "image"){
					$("#bg-input").html(html.bg_inputs[1]);
					$("#pre-defined-images").change(function() {
						var index = $("#pre-defined-images option:selected").val();
						$("#background-image").val(settings.background.images[index]);
					});
				} else if (selected == "video"){
					$("#bg-input").html(html.bg_inputs[2]);
					$("#pre-defined-videos").change(function() {
						var index = $("#pre-defined-videos option:selected").val();
						$("#background-video").val(settings.background.videos[index]);
					});
				}
			});
			$("#pre-defined-filters").change(function() {
				var index = $("#pre-defined-filters option:selected").val();
				$("#background-filter").val(settings.background.filters[index]);
			});
			if(settings.background.type == "image"){
				$("#pre-defined-images").change(function() {
					var index = $("#pre-defined-images option:selected").val();
					$("#background-image").val(settings.background.images[index]);
				});
			} else if(settings.background.type == "video"){
				$("#pre-defined-videos").change(function() {
					var index = $("#pre-defined-videos option:selected").val();
					$("#background-video").val(settings.background.videos[index]);
				});
			}
			if(!settings.light_mode){
				$( window ).scroll(function() {
					reCalculateDuration();
				});
			}
		}
	}
})();