NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Gaana Dark Auto-Enable & Auto-Play
// @description Auto-enables Gaana Dark theme. Works only on gaana.com
// @author navchandar
// @license MIT
// @version 2.4
// @match *://*.gaana.com/*
// @excludes *
// @run-at document-start
// @homepage https://github.com/navchandar
// @copyright 2022, navchandar(https://openuserjs.org/users/navchandar)
// @updateURL https://openuserjs.org/meta/navchandar/Gaana_Dark_Auto-Enable_Auto-Play.meta.js
// @downloadURL https://openuserjs.org/install/navchandar/Gaana_Dark_Auto-Enable_Auto-Play.user.js
// @icon https://css375.gaanacdn.com/images/favicon.ico
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length);
}
}
return null;
}
function createCookie(name, value, days) {
var expires = ""
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
}
else {
expires = "";
}
document.cookie = name + "=" + value + expires + "; domain='gaana.com'; path=/";
}
function eraseCookie(name) {
createCookie(name, "", -1);
}
// Make theme black
createCookie('hd_marker', true, 100);
createCookie('themecolor_v1', 'black', 100);
createCookie('themedetect1', 1, 100);
// Play HD songs
createCookie('songquality', 'HD', 100);
// Removes ADs hopefully.
eraseCookie('globalAdsCounterThreeMin');
eraseCookie('globalAdsCounterTwoMin');
eraseCookie('globalAdsCounterTwoMinBg');
createCookie('globalAdsCounterThreeMin', 0, 100);
createCookie('globalAdsCounterTwoMin', 0, 100);
createCookie('globalAdsCounterTwoMinBg', 0, 100);
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function sleepFunc() {
await sleep(3000);
}
/*--- waitForKeyElements(): A utility function, for Greasemonkey scripts,
that detects and handles AJAXed content.
Usage example:
waitForKeyElements (
"div.comments"
, commentCallbackFunction
);
//--- Page-specific function to do what we want when the node is found.
function commentCallbackFunction (jNode) {
jNode.text ("This comment changed by waitForKeyElements().");
}
IMPORTANT: This function requires your script to have loaded jQuery.
*/
function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
var targetNodes, btargetsFound;
if (typeof iframeSelector == "undefined")
targetNodes = $(selectorTxt);
else
targetNodes = $(iframeSelector).contents()
.find(selectorTxt);
if (targetNodes && targetNodes.length > 0) {
btargetsFound = true;
/*--- Found target node(s). Go through each and act if they
are new.
*/
targetNodes.each(function () {
var jThis = $(this);
var alreadyFound = jThis.data('alreadyFound') || false;
if (!alreadyFound) {
//--- Call the payload function.
var cancelFound = actionFunction(jThis);
if (cancelFound)
btargetsFound = false;
else
jThis.data('alreadyFound', true);
}
});
}
else {
btargetsFound = false;
}
//--- Get the timer-control variable for this selector.
var controlObj = waitForKeyElements.controlObj || {};
var controlKey = selectorTxt.replace(/[^\w]/g, "_");
var timeControl = controlObj[controlKey];
//--- Now set or clear the timer as appropriate.
if (btargetsFound && bWaitOnce && timeControl) {
//--- The only condition where we need to clear the timer.
clearInterval(timeControl);
delete controlObj[controlKey]
}
else {
//--- Set a timer, if needed.
if (!timeControl) {
timeControl = setInterval(function () {
waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector);
}, 300);
controlObj[controlKey] = timeControl;
}
}
waitForKeyElements.controlObj = controlObj;
}
function delete_ad_elems(classname) {
try {
var my_elems = document.getElementsByClassName(classname);
for (var k = my_elems.length - 1; k >= 0; --k) {
my_elems[k].parentElement.removeChild(my_elems[k]);
}
}
catch (Exception) {};
}
function deleteAds() {
delete_ad_elems("rhs-container");
delete_ad_elems("right add_block ads-section");
delete_ad_elems("adunit");
delete_ad_elems("appdow_inner clearfix");
delete_ad_elems("homeappdownolad");
}
function UpdateWidth() {
try {
document.querySelector('div.activeonscroll.clearfix').style.width = "100%";
}
catch (Exception) {};
}
function UpdateStyle() {
try {
document.querySelector('#mainarea').style.padding = "0 10px 0 70px";
}
catch (Exception) {};
}
function enableDarkMode() {
if (!document.querySelector('body[class="dark"]') && document.querySelector('button[aria-label="theme button"]')) {
document.querySelector('button[aria-label="theme button"]').click();
}
}
function autoPlay() {
if (document.querySelector('button[title="Play All"]')) {
document.querySelector('button[title="Play All"]').click();
clearInterval(playinterval);
}
}
waitForKeyElements("div.activeonscroll.clearfix", UpdateWidth);
waitForKeyElements("#mainarea", UpdateStyle);
// call this every 3 seconds to update according to page load
let playinterval = setInterval(function () {
waitForKeyElements('button[aria-label="theme button"]', enableDarkMode);
waitForKeyElements('button[title="Play All"]', autoPlay);
}, 5000);
// call this every 3 seconds to update according to page load
setInterval(function () {
deleteAds();
}, 3000);