Skip to content

Instantly share code, notes, and snippets.

@janglapuk
Last active October 12, 2020 12:20
Show Gist options
  • Save janglapuk/38d4cab117bddd84177bf510c827fa0c to your computer and use it in GitHub Desktop.
Save janglapuk/38d4cab117bddd84177bf510c827fa0c to your computer and use it in GitHub Desktop.
[Tampermonkey] Disney+ Hotstar Default Streaming Quality Setter
// ==UserScript==
// @name Disney+ Hotstar Default Streaming Quality Setter
// @namespace http://github.com/janglapuk
// @version 0.5
// @description Set Disney+ Hotstar default streaming quality and fullscreen options
// @author janglapuk
// @match https://www.hotstar.com/*
// @grant none
// @updateURL https://gist.githubusercontent.com/janglapuk/38d4cab117bddd84177bf510c827fa0c/raw/hotstar-default-quality-setter.user.js
// @downloadURL https://gist.githubusercontent.com/janglapuk/38d4cab117bddd84177bf510c827fa0c/raw/hotstar-default-quality-setter.user.js
// @require https://code.jquery.com/jquery-3.5.1.min.js
// @require https://gist.githubusercontent.com/BrockA/2625891/raw/waitForKeyElements.js
// @require https://cdn.jsdelivr.net/npm/sweetalert2@10
// @require https://cdnjs.cloudflare.com/ajax/libs/screenfull.js/5.0.2/screenfull.min.js
// ==/UserScript==
(function() {
'use strict';
var defaultFallbackQuality = "medium";
var defaultFallbackFullscreen = false;
function getSavedQuality() {
var currentSaved;
try {
currentSaved = JSON.parse(localStorage.getItem("hotstar-saved-state")) || undefined;
} catch(e) {
console.warn("[Disney+ Hotstar Quality Setter] Session Saved State not parsed :: ", e);
}
if(currentSaved === undefined) {
return {'quality': defaultFallbackQuality, 'fullscreen': defaultFallbackFullscreen};
}
return currentSaved;
}
function setDefaultFullscreen(defaultFullscreen) {
var currentSaved = getSavedQuality();
currentSaved.fullscreen = defaultFullscreen;
localStorage.setItem("hotstar-saved-state", JSON.stringify(currentSaved));
}
function getPlayerState() {
var currentState = undefined;
try {
currentState = JSON.parse(sessionStorage.getItem("vjs-player-state")) || undefined;
} catch(e) {
console.warn("[Disney+ Hotstar Quality Setter] Session Store Player state not parsed :: ", e);
}
return currentState;
}
function setDefaultQuality(defaultQuality) {
var currentState = getPlayerState();
if(currentState === undefined) {
currentState = {"quality": defaultQuality};
} else {
currentState.quality = defaultQuality;
}
var currentSaved = getSavedQuality();
sessionStorage.setItem("vjs-player-state", JSON.stringify(currentState));
currentSaved.quality = defaultQuality;
localStorage.setItem("hotstar-saved-state", JSON.stringify(currentSaved));
console.info("[Disney+ Hotstar Quality Setter] Default state set to: " + JSON.stringify(currentState));
}
jQuery(document).ready(function() {
var currentSaved = getSavedQuality();
setDefaultQuality(currentSaved.quality);
waitForKeyElements('.bottom-right-panel', function() {
var $wrapper = jQuery('<div/>').addClass('skin-lock-wrapper');
(function() {
var $control = jQuery('<div/>').addClass('default-quality-control player-control');
var $img = jQuery('<img/>');
$img.css('width', '26px');
$img.css('height', '26px');
$img.attr('src', 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9ImRlc2t0b3AiIHZpZXdCb3g9IjAgMCA0OCA0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxzdHlsZT4KICAgICAgLnZpLXByaW1hcnkgewogICAgICAgIGZpbGw6ICNGRjZFNkU7CiAgICAgIH0KCiAgICAgIC52aS1hY2NlbnQgewogICAgICAgIGZpbGw6ICMwQzAwNTg7CiAgICAgIH0KICAgIDwvc3R5bGU+PC9kZWZzPjxwYXRoIGNsYXNzPSJ2aS1wcmltYXJ5IiBkPSJNNDMsMzZINVY5SDQzVjM2Wk0zMSw0M0gxN1Y0MUgzMXYyWiIvPjxwYXRoIGNsYXNzPSJ2aS1hY2NlbnQiIGQ9Ik04LDMzVjEySDQwVjMzSDhabTExLDNIMjl2M2wyLDJIMTdsMi0yVjM2WiIvPjwvc3ZnPg==');
var inputOptions = {
"AUTO": "Auto",
"low": "Low quality",
"medium": "Medium quality",
"high": "High quality",
};
$img.on('click', async function() {
var currentSaved = getSavedQuality();
const { value: quality } = await Swal.fire({
title: 'Select Default Streaming Quality',
input: 'radio',
showCancelButton: true,
width: 400,
icon: 'error',
iconHtml: '<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9ImRlc2t0b3AiIHZpZXdCb3g9IjAgMCA0OCA0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxzdHlsZT4KICAgICAgLnZpLXByaW1hcnkgewogICAgICAgIGZpbGw6ICNGRjZFNkU7CiAgICAgIH0KCiAgICAgIC52aS1hY2NlbnQgewogICAgICAgIGZpbGw6ICMwQzAwNTg7CiAgICAgIH0KICAgIDwvc3R5bGU+PC9kZWZzPjxwYXRoIGNsYXNzPSJ2aS1wcmltYXJ5IiBkPSJNNDMsMzZINVY5SDQzVjM2Wk0zMSw0M0gxN1Y0MUgzMXYyWiIvPjxwYXRoIGNsYXNzPSJ2aS1hY2NlbnQiIGQ9Ik04LDMzVjEySDQwVjMzSDhabTExLDNIMjl2M2wyLDJIMTdsMi0yVjM2WiIvPjwvc3ZnPg==" />',
inputValue: currentSaved.quality,
inputOptions: inputOptions,
inputValidator: (value) => {
if (!value) {
return 'You need to choose something!'
}
}
});
if(quality !== undefined) {
setDefaultQuality(quality);
document.location.reload();
}
});
$wrapper.append(
$control.append(
$img
)
).insertBefore('.bottom-right-panel > .skin-lock-wrapper:last');
})();
(function() {
var $control = jQuery('<div/>').addClass('default-fullscreen-control player-control');
var $img = jQuery('<img/>');
$img.css('width', '22px');
$img.css('height', '22px');
$img.attr('src', 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgaWQ9IkxheWVyXzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnPjxnPjxsaW5lYXJHcmFkaWVudCBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9IlNWR0lEXzFfIiB4MT0iMC4wMDAwMDM4IiB4Mj0iNTEyIiB5MT0iMjU2IiB5Mj0iMjU2Ij48c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNBMzY0QUIiLz48c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM4QzNEOTYiLz48L2xpbmVhckdyYWRpZW50PjxjaXJjbGUgY3g9IjI1NiIgY3k9IjI1NiIgZmlsbD0idXJsKCNTVkdJRF8xXykiIHI9IjI1NiIvPjxsaW5lYXJHcmFkaWVudCBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9IlNWR0lEXzJfIiB4MT0iNDIuNjY2NjY3OSIgeDI9IjQ2OS4zMzMzNDM1IiB5MT0iMjU2LjAwMDUxODgiIHkyPSIyNTYuMDAwNTE4OCI+PHN0b3Agb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojOEMzRDk2Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQTM2NEFCIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBkPSJNMjU2LDQ2OS4zMzM4NjIzYy0xMTcuNjMxNDY5NywwLTIxMy4zMzMzMjgyLTk1LjcwMTg3MzgtMjEzLjMzMzMyODItMjEzLjMzMzM0MzUgICAgUzEzOC4zNjg1MzAzLDQyLjY2NzE5ODIsMjU2LDQyLjY2NzE5ODJjMTE3LjYzNjI2MSwwLDIxMy4zMzMzNDM1LDk1LjcwMTg2NjEsMjEzLjMzMzM0MzUsMjEzLjMzMzMxMyAgICBTMzczLjYzNjI2MSw0NjkuMzMzODYyMywyNTYsNDY5LjMzMzg2MjN6IiBmaWxsPSJ1cmwoI1NWR0lEXzJfKSIvPjwvZz48cG9seWdvbiBvcGFjaXR5PSIwLjMiIHBvaW50cz0iMzg0LDIwOCAzODQsMTQ0IDMyMCwxNDQgMzIwLDIwMC45MzAxMyAyMDAuOTMwMTMsMzIwIDE0NCwzMjAgMTQ0LDM4NCAyMDgsMzg0IDIwOCwzMjcuMDcwOTIyOSAgICAzMjcuMDcwOTIyOSwyMDggICIvPjxwb2x5Z29uIGZpbGw9IiNGRkZGRkYiIHBvaW50cz0iMzc2LDIwMCAzNzYsMTM2IDMxMiwxMzYgMzEyLDE5Mi45MzAxMyAxOTIuOTMwMTMsMzEyIDEzNiwzMTIgMTM2LDM3NiAyMDAsMzc2IDIwMCwzMTkuMDcwOTIyOSAgICAzMTkuMDcwOTIyOSwyMDAgICIvPjwvZz48L3N2Zz4=');
$img.on('click', async function() {
var currentSaved = getSavedQuality();
const { value: alwaysFullscreen } = await Swal.fire({
title: 'Fullscreen Option',
input: 'checkbox',
showCancelButton: true,
width: 400,
icon: 'error',
iconHtml: '<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9ImRlc2t0b3AiIHZpZXdCb3g9IjAgMCA0OCA0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxzdHlsZT4KICAgICAgLnZpLXByaW1hcnkgewogICAgICAgIGZpbGw6ICNGRjZFNkU7CiAgICAgIH0KCiAgICAgIC52aS1hY2NlbnQgewogICAgICAgIGZpbGw6ICMwQzAwNTg7CiAgICAgIH0KICAgIDwvc3R5bGU+PC9kZWZzPjxwYXRoIGNsYXNzPSJ2aS1wcmltYXJ5IiBkPSJNNDMsMzZINVY5SDQzVjM2Wk0zMSw0M0gxN1Y0MUgzMXYyWiIvPjxwYXRoIGNsYXNzPSJ2aS1hY2NlbnQiIGQ9Ik04LDMzVjEySDQwVjMzSDhabTExLDNIMjl2M2wyLDJIMTdsMi0yVjM2WiIvPjwvc3ZnPg==" />',
inputValue: currentSaved.fullscreen,
inputPlaceholder: 'Always fullscreen on watching',
});
if(alwaysFullscreen !== undefined) {
setDefaultFullscreen(Boolean(alwaysFullscreen));
document.location.reload();
}
});
$wrapper.append(
$control.append(
$img
)
).insertBefore('.bottom-right-panel > .skin-lock-wrapper:last');
})();
});
waitForKeyElements('.skin-lock-wrapper > .fullscreen.player-control', function() {
var currentSaved = getSavedQuality();
if(currentSaved.fullscreen) {
screenfull.toggle(jQuery('.player-base')[0]);
}
});
waitForKeyElements('.player-base', function() {
jQuery('.player-base').dblclick(function() {
screenfull.toggle(jQuery('.player-base')[0]);
});
});
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment