Picarto.tv Video.js replacer

Replaces the player on picarto.tv with one which works with Firefox on Linux

  1. // ==UserScript==
  2. // @name Picarto.tv Video.js replacer
  3. // @namespace picarto.tv.video.js.stuff.dasprids.de
  4. // @description Replaces the player on picarto.tv with one which works with Firefox on Linux
  5. // @include https://picarto.tv/*
  6. // @version 3
  7. // @grant none
  8. // @run-at document-start
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/video.js/4.12.15/video.js
  10. // ==/UserScript==
  11.  
  12. var changed = false;
  13.  
  14. window.addEventListener('beforescriptexecute', function(e){
  15. src = e.target.src;
  16.  
  17. if (src.search(/jwplayer\.js/) != -1) {
  18. changed = true;
  19. e.preventDefault();
  20. e.stopPropagation();
  21. mockJwPlayer();
  22. };
  23.  
  24. if (changed) {
  25. window.removeEventListener(e.type, arguments.callee, true);
  26. }
  27. }, true);
  28.  
  29. function addStyleSheet(style){
  30. var getHead = document.getElementsByTagName("HEAD")[0];
  31. var cssNode = window.document.createElement( 'style' );
  32. var elementStyle= getHead.appendChild(cssNode)
  33. elementStyle.innerHTML = style;
  34. return elementStyle;
  35. }
  36.  
  37. addStyleSheet('@import "https://vjs.zencdn.net/4.12/video-js.css";');
  38.  
  39. function mockJwPlayer()
  40. {
  41. videojs.options.techOrder = ['flash'];
  42. unsafeWindow.jwplayer = function(id){
  43. var container = $('#' + id);
  44. var player = {};
  45. if (container.data('player')) {
  46. player = container.data('player');
  47. } else {
  48. container.data('player', player);
  49. }
  50. player.setMute = function(){
  51. return player;
  52. };
  53.  
  54. player.setup = function(options){
  55. if (!player.videojs) {
  56. container.html('<video id="videojs' + id + '" class="video-js vjs-default-skin" controls preload="none" data-setup="{}"><source src="' + options.file + '" type="rtmp/mp4"></video>');
  57. player.videojs = videojs('videojs' + id);
  58. }
  59. if (options.width) {
  60. player.videojs.width(options.width);
  61. }
  62. if (options.height) {
  63. player.videojs.height(options.height);
  64. }
  65. if (options.mute) {
  66. player.videojs.muted(true);
  67. } else {
  68. player.videojs.muted(false);
  69. }
  70. if (options.autostart) {
  71. player.videojs.play();
  72. }
  73. if (options.aspectratio) {
  74. var ratioParts = options.aspectratio.split(':');
  75. var aspectRatio = ratioParts[1] / ratioParts[0];
  76.  
  77. function resizeVideoJs(){
  78. var width = document.getElementById(player.videojs.id()).parentElement.offsetWidth;
  79. player.videojs.height(width * aspectRatio);
  80. }
  81.  
  82. resizeVideoJs();
  83. window.addEventListener('resize', resizeVideoJs);
  84. }
  85.  
  86. return player;
  87. };
  88. player.onPause = function(callback){
  89. this.videojs.on('pause', callback);
  90. return player;
  91. };
  92. player.onError = function(callback){
  93. this.videojs.on('error', callback);
  94. return player;
  95. };
  96. player.onComplete = function(callback){
  97. this.videojs.on('ended', callback);
  98. return player;
  99. };
  100.  
  101. player.onBuffer = function(callback){
  102. this.videojs.on('waiting', callback);
  103. return player;
  104. };
  105. player.onPlay = function(callback){
  106. this.videojs.on('play', callback);
  107. return player;
  108. };
  109. player.onDisplayClick = function(callback){
  110. // No equivalent
  111. return player;
  112. };
  113. player.getMute = function(){
  114. return this.videojs.muted();
  115. };
  116. return player;
  117. };
  118. }