m.YouTube.com allow background play TEST SCRIPT

Allows m.YouTube.com background play, especially useful for iPhone users

  1. // ==UserScript==
  2. // @name m.YouTube.com allow background play TEST SCRIPT
  3. // @namespace m-youtube-com-allow-background-play
  4. // @version 1.0
  5. // @description Allows m.YouTube.com background play, especially useful for iPhone users
  6. // @author hlorand.hu
  7. // @match https://m.youtube.com/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
  9. // @grant none
  10. // @license https://creativecommons.org/licenses/by-nc-sa/4.0/
  11. // ==/UserScript==
  12. // Original code: https://addons.mozilla.org/en-US/android/addon/video-background-play-fix/
  13. (function() {
  14. //'use strict';
  15. const IS_YOUTUBE = window.location.hostname.search(/(?:^|.+\.)youtube\.com/) > -1 ||
  16. window.location.hostname.search(/(?:^|.+\.)youtube-nocookie\.com/) > -1;
  17. const IS_MOBILE_YOUTUBE = window.location.hostname == 'm.youtube.com';
  18. const IS_DESKTOP_YOUTUBE = IS_YOUTUBE && !IS_MOBILE_YOUTUBE;
  19. const IS_VIMEO = window.location.hostname.search(/(?:^|.+\.)vimeo\.com/) > -1;
  20.  
  21. const IS_ANDROID = window.navigator.userAgent.indexOf('Android') > -1;
  22.  
  23. // Page Visibility API
  24. if (IS_ANDROID || !IS_DESKTOP_YOUTUBE) {
  25. Object.defineProperties(document.wrappedJSObject,
  26. { 'hidden': {value: false}, 'visibilityState': {value: 'visible'} });
  27. }
  28.  
  29. window.addEventListener(
  30. 'visibilitychange', evt => evt.stopImmediatePropagation(), true);
  31.  
  32. // Fullscreen API
  33. if (IS_VIMEO) {
  34. window.addEventListener(
  35. 'fullscreenchange', evt => evt.stopImmediatePropagation(), true);
  36. }
  37.  
  38. // User activity tracking
  39. if (IS_YOUTUBE) {
  40. loop(pressKey, 60 * 1000, 10 * 1000); // every minute +/- 5 seconds
  41. }
  42.  
  43. function pressKey() {
  44. const keyCodes = [18];
  45. let key = keyCodes[getRandomInt(0, keyCodes.length)];
  46. sendKeyEvent("keydown", key);
  47. sendKeyEvent("keyup", key);
  48. }
  49.  
  50. function sendKeyEvent (aEvent, aKey) {
  51. document.dispatchEvent(new KeyboardEvent(aEvent, {
  52. bubbles: true,
  53. cancelable: true,
  54. keyCode: aKey,
  55. which: aKey,
  56. }));
  57. }
  58.  
  59. function loop(aCallback, aDelay, aJitter) {
  60. let jitter = getRandomInt(-aJitter/2, aJitter/2);
  61. let delay = Math.max(aDelay + jitter, 0);
  62.  
  63. window.setTimeout(() => {
  64. aCallback();
  65. loop(aCallback, aDelay, aJitter);
  66. }, delay);
  67. }
  68.  
  69. function getRandomInt(aMin, aMax) {
  70. let min = Math.ceil(aMin);
  71. let max = Math.floor(aMax);
  72. return Math.floor(Math.random() * (max - min)) + min;
  73. }
  74.  
  75. })();