diff --git a/patches/5-proxy-csp.patch b/patches/3-proxy-csp.patch similarity index 100% rename from patches/5-proxy-csp.patch rename to patches/3-proxy-csp.patch diff --git a/patches/6-donate-page.patch b/patches/4-donate-page.patch similarity index 100% rename from patches/6-donate-page.patch rename to patches/4-donate-page.patch diff --git a/patches/7-decrease-buffer-seconds-for-saving-bandwidth.patch b/patches/5-decrease-buffer-seconds-for-saving-bandwidth.patch similarity index 100% rename from patches/7-decrease-buffer-seconds-for-saving-bandwidth.patch rename to patches/5-decrease-buffer-seconds-for-saving-bandwidth.patch diff --git a/patches/8-disable-notifications.patch b/patches/6-disable-notifications.patch similarity index 100% rename from patches/8-disable-notifications.patch rename to patches/6-disable-notifications.patch diff --git a/patches/9-range-header.patch b/patches/7-range-header.patch similarity index 100% rename from patches/9-range-header.patch rename to patches/7-range-header.patch diff --git a/patches/8-3011.patch b/patches/8-3011.patch new file mode 100644 index 0000000..5d9a3f4 --- /dev/null +++ b/patches/8-3011.patch @@ -0,0 +1,219 @@ +From acf77170dfc9fa98222e96f4423f2ab87b4a1937 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=C3=89milien=20Devos?= +Date: Fri, 8 Apr 2022 16:44:09 +0000 +Subject: [PATCH] bump videojs to 7.12.1 and improve playback exp related to + #2848 + +--- + assets/js/player.js | 63 ++++++++++++------- + ...silvermine-videojs-quality-selector.min.js | 4 +- + src/invidious/routes/api/manifest.cr | 4 +- + src/invidious/views/components/player.ecr | 18 +++++- + src/invidious/views/embed.ecr | 3 +- + src/invidious/views/watch.ecr | 3 +- + videojs-dependencies.yml | 8 +-- + 7 files changed, 69 insertions(+), 34 deletions(-) + +diff --git a/assets/js/player.js b/assets/js/player.js +index 74cdd9876..1e00abfe0 100644 +--- a/assets/js/player.js ++++ b/assets/js/player.js +@@ -41,6 +41,12 @@ embed_url = location.origin + '/embed/' + video_data.id + embed_url.search; + var save_player_pos_key = "save_player_pos"; + + videojs.Vhs.xhr.beforeRequest = function(options) { ++ if (options.headers) { ++ if (options.headers.Range) { ++ options.uri = options.uri + '&range=' + options.headers.Range.split("=")[1]; ++ delete options.headers.Range; ++ } ++ } + if (options.uri.indexOf('videoplayback') === -1 && options.uri.indexOf('local=true') === -1) { + options.uri = options.uri + '?local=true'; + } +@@ -49,6 +55,42 @@ videojs.Vhs.xhr.beforeRequest = function(options) { + + var player = videojs('player', options); + ++player.on('error', () => { ++ if (video_data.params.quality !== 'dash') { ++ if (!player.currentSrc().includes("local=true") && !video_data.local_disabled) { ++ var currentSources = player.currentSources(); ++ for (var i = 0; i < currentSources.length; i++) { ++ currentSources[i]["src"] += "&local=true" ++ } ++ player.src(currentSources) ++ } ++ else if (player.error().code === 2 || player.error().code === 4) { ++ setTimeout(function (event) { ++ console.log('An error occurred in the player, reloading...'); ++ ++ var currentTime = player.currentTime(); ++ var playbackRate = player.playbackRate(); ++ var paused = player.paused(); ++ ++ player.load(); ++ ++ if (currentTime > 0.5) currentTime -= 0.5; ++ ++ player.currentTime(currentTime); ++ player.playbackRate(playbackRate); ++ ++ if (!paused) player.play(); ++ }, 10000); ++ } ++ } ++}); ++ ++if (video_data.params.quality == 'dash') { ++ player.reloadSourceOnError({ ++ errorInterval: 10 ++ }); ++} ++ + /** + * Function for add time argument to url + * @param {String} url +@@ -144,27 +186,6 @@ if (isMobile()) { + }) + } + +-player.on('error', function (event) { +- if (player.error().code === 2 || player.error().code === 4) { +- setTimeout(function (event) { +- console.log('An error occurred in the player, reloading...'); +- +- var currentTime = player.currentTime(); +- var playbackRate = player.playbackRate(); +- var paused = player.paused(); +- +- player.load(); +- +- if (currentTime > 0.5) currentTime -= 0.5; +- +- player.currentTime(currentTime); +- player.playbackRate(playbackRate); +- +- if (!paused) player.play(); +- }, 5000); +- } +-}); +- + // Enable VR video support + if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) { + player.crossOrigin("anonymous") +diff --git a/assets/js/silvermine-videojs-quality-selector.min.js b/assets/js/silvermine-videojs-quality-selector.min.js +index 88621e8d6..1877047dc 100644 +--- a/assets/js/silvermine-videojs-quality-selector.min.js ++++ b/assets/js/silvermine-videojs-quality-selector.min.js +@@ -1,4 +1,4 @@ +-/*! @silvermine/videojs-quality-selector 2020-03-02 v1.1.2-36-g64d620a-dirty */ ++/*! @silvermine/videojs-quality-selector 2022-04-13 v1.1.2-43-gaa06e72-dirty */ + +-!function u(o,c,a){function l(e,n){if(!c[e]){if(!o[e]){var t="function"==typeof require&&require;if(!n&&t)return t(e,!0);if(s)return s(e,!0);var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}var i=c[e]={exports:{}};o[e][0].call(i.exports,function(n){return l(o[e][1][n]||n)},i,i.exports,u,o,c,a)}return c[e].exports}for(var s="function"==typeof require&&require,n=0;n":">",'"':""","'":"'","`":"`"},W=h.invert(P);h.escape=D(P),h.unescape=D(W),h.result=function(n,e,t){h.isArray(e)||(e=[e]);var r=e.length;if(!r)return h.isFunction(t)?t.call(n):t;for(var i=0;i/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};function Y(n){return"\\"+K[n]}var z=/(.)^/,K={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},G=/\\|'|\r|\n|\u2028|\u2029/g;h.template=function(u,n,e){!n&&e&&(n=e),n=h.defaults({},n,h.templateSettings);var t,r=RegExp([(n.escape||z).source,(n.interpolate||z).source,(n.evaluate||z).source].join("|")+"|$","g"),o=0,c="__p+='";u.replace(r,function(n,e,t,r,i){return c+=u.slice(o,i).replace(G,Y),o=i+n.length,e?c+="'+\n((__t=("+e+"))==null?'':_.escape(__t))+\n'":t?c+="'+\n((__t=("+t+"))==null?'':__t)+\n'":r&&(c+="';\n"+r+"\n__p+='"),n}),c+="';\n",n.variable||(c="with(obj||{}){\n"+c+"}\n"),c="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+c+"return __p;\n";try{t=new Function(n.variable||"obj","_",c)}catch(n){throw n.source=c,n}function i(n){return t.call(this,n,h)}var a=n.variable||"obj";return i.source="function("+a+"){\n"+c+"}",i},h.chain=function(n){var e=h(n);return e._chain=!0,e};function H(n,e){return n._chain?h(e).chain():e}h.mixin=function(t){return h.each(h.functions(t),function(n){var e=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),H(this,e.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];h.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],H(this,n)}}),h.each(["concat","join","slice"],function(n){var e=r[n];h.prototype[n]=function(){return H(this,e.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}()}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events");e.exports=function(n){var r=n.getComponent("MenuItem");return n.extend(r,{constructor:function(n,e){var t=e.source;if(!i.isObject(t))throw new Error('was not provided a "source" object, but rather: '+typeof t);e=i.extend({selectable:!0,label:t.label},e),r.call(this,n,e),this.source=t},handleClick:function(n){r.prototype.handleClick.call(this,n),this.player().trigger(u.QUALITY_REQUESTED,this.source)}})}},{"../events":5,underscore:2}],4:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events"),o=n("./QualityOption"),c="vjs-quality-changing";e.exports=function(n){var e,r=n.getComponent("MenuButton"),t=o(n);return e=n.extend(r,{constructor:function(t,n){r.call(this,t,n),t.on(u.QUALITY_REQUESTED,function(n,e){this.setSelectedSource(e),t.addClass(c),t.one("loadeddata",function(){t.removeClass(c)})}.bind(this)),t.on(u.PLAYER_SOURCES_CHANGED,function(){this.update()}.bind(this)),t.on(u.QUALITY_SELECTED,function(n,e){this.setSelectedSource(e)}.bind(this)),t.one("ready",function(){this.selectedSrc=t.src(),this.update()}.bind(this)),this.controlText("Open quality selector menu")},setSelectedSource:function(n){var e=n?n.src:void 0;this.selectedSrc!==e&&(this.selectedSrc=e,i.each(this.items,function(n){n.selected(n.source.src===e)}))},createItems:function(){var e=this.player(),n=e.currentSources();return i.map(n,function(n){return new t(e,{source:n,selected:n.src===this.selectedSrc})}.bind(this))},buildWrapperCSSClass:function(){return"vjs-quality-selector "+r.prototype.buildWrapperCSSClass.call(this)}}),n.registerComponent("QualitySelector",e),e}},{"../events":5,"./QualityOption":3,underscore:2}],5:[function(n,e,t){"use strict";e.exports={QUALITY_REQUESTED:"qualityRequested",QUALITY_SELECTED:"qualitySelected",PLAYER_SOURCES_CHANGED:"playerSourcesChanged"}},{}],6:[function(n,e,t){"use strict";var c=n("underscore"),r=n("./events"),i=n("./components/QualitySelector"),u=n("./middleware/SourceInterceptor"),a=n("./util/SafeSeek");e.exports=function(n){n=n||window.videojs,i(n),u(n),n.hook("setup",function(o){o.on(r.QUALITY_REQUESTED,function(n,e){var t=o.currentSources(),r=o.currentTime(),i=o.playbackRate(),u=o.paused();c.each(t,function(n){n.selected=!1}),c.findWhere(t,{src:e.src}).selected=!0,o._qualitySelectorSafeSeek&&o._qualitySelectorSafeSeek.onQualitySelectionChange(),o.src(t),o.ready(function(){o._qualitySelectorSafeSeek&&!o._qualitySelectorSafeSeek.hasFinished()||(o._qualitySelectorSafeSeek=new a(o,r),o.playbackRate(i)),u||o.play()})})})},e.exports.EVENTS=r},{"./components/QualitySelector":4,"./events":5,"./middleware/SourceInterceptor":7,"./util/SafeSeek":9,underscore:2}],7:[function(n,e,t){"use strict";var u=n("underscore"),o=n("../events");e.exports=function(n){n.use("*",function(i){return{setSource:function(n,e){var t,r=i.currentSources();i._qualitySelectorSafeSeek&&i._qualitySelectorSafeSeek.onPlayerSourcesChange(),u.isEqual(r,i._qualitySelectorPreviousSources)||(i.trigger(o.PLAYER_SOURCES_CHANGED,r),i._qualitySelectorPreviousSources=r),t=u.find(r,function(n){return!0===n.selected||"true"===n.selected||"selected"===n.selected})||n,i.trigger(o.QUALITY_SELECTED,t),e(null,t)}}})}},{"../events":5,underscore:2}],8:[function(n,e,t){"use strict";n("./index")()},{"./index":6}],9:[function(n,e,t){"use strict";var r=n("class.extend");e.exports=r.extend({init:function(n,e){this._player=n,this._seekToTime=e,this._hasFinished=!1,this._keepThisInstanceWhenPlayerSourcesChange=!1,this._seekWhenSafe()},_seekWhenSafe:function(){this._player.readyState()<3?(this._seekFn=this._seek.bind(this),this._player.one("canplay",this._seekFn)):this._seek()},onPlayerSourcesChange:function(){this._keepThisInstanceWhenPlayerSourcesChange?this._keepThisInstanceWhenPlayerSourcesChange=!1:this.cancel()},onQualitySelectionChange:function(){this.hasFinished()||(this._keepThisInstanceWhenPlayerSourcesChange=!0)},_seek:function(){this._player.currentTime(this._seekToTime),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0},hasFinished:function(){return this._hasFinished},cancel:function(){this._player.off("canplay",this._seekFn),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0}})},{"class.extend":1}]},{},[8]); ++!function u(o,c,a){function l(e,n){if(!c[e]){if(!o[e]){var t="function"==typeof require&&require;if(!n&&t)return t(e,!0);if(s)return s(e,!0);var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}var i=c[e]={exports:{}};o[e][0].call(i.exports,function(n){return l(o[e][1][n]||n)},i,i.exports,u,o,c,a)}return c[e].exports}for(var s="function"==typeof require&&require,n=0;n":">",'"':""","'":"'","`":"`"},W=h.invert(P);h.escape=D(P),h.unescape=D(W),h.result=function(n,e,t){h.isArray(e)||(e=[e]);var r=e.length;if(!r)return h.isFunction(t)?t.call(n):t;for(var i=0;i/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};function Y(n){return"\\"+K[n]}var z=/(.)^/,K={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},G=/\\|'|\r|\n|\u2028|\u2029/g;h.template=function(u,n,e){!n&&e&&(n=e),n=h.defaults({},n,h.templateSettings);var t,r=RegExp([(n.escape||z).source,(n.interpolate||z).source,(n.evaluate||z).source].join("|")+"|$","g"),o=0,c="__p+='";u.replace(r,function(n,e,t,r,i){return c+=u.slice(o,i).replace(G,Y),o=i+n.length,e?c+="'+\n((__t=("+e+"))==null?'':_.escape(__t))+\n'":t?c+="'+\n((__t=("+t+"))==null?'':__t)+\n'":r&&(c+="';\n"+r+"\n__p+='"),n}),c+="';\n",n.variable||(c="with(obj||{}){\n"+c+"}\n"),c="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+c+"return __p;\n";try{t=new Function(n.variable||"obj","_",c)}catch(n){throw n.source=c,n}function i(n){return t.call(this,n,h)}var a=n.variable||"obj";return i.source="function("+a+"){\n"+c+"}",i},h.chain=function(n){var e=h(n);return e._chain=!0,e};function H(n,e){return n._chain?h(e).chain():e}h.mixin=function(t){return h.each(h.functions(t),function(n){var e=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),H(this,e.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];h.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],H(this,n)}}),h.each(["concat","join","slice"],function(n){var e=r[n];h.prototype[n]=function(){return H(this,e.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}()}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events");e.exports=function(n){var r=n.getComponent("MenuItem");return n.extend(r,{constructor:function(n,e){var t=e.source;if(!i.isObject(t))throw new Error('was not provided a "source" object, but rather: '+typeof t);e=i.extend({selectable:!0,label:t.label},e),r.call(this,n,e),this.source=t},handleClick:function(n){r.prototype.handleClick.call(this,n),this.player().trigger(u.QUALITY_REQUESTED,this.source)}})}},{"../events":5,underscore:2}],4:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events"),o=n("./QualityOption"),c="vjs-quality-changing";e.exports=function(n){var e,r=n.getComponent("MenuButton"),t=o(n);return e=n.extend(r,{constructor:function(t,n){r.call(this,t,n),t.on(u.QUALITY_REQUESTED,function(n,e){this.setSelectedSource(e),t.addClass(c),t.one("loadeddata",function(){t.removeClass(c)})}.bind(this)),t.on(u.PLAYER_SOURCES_CHANGED,function(){this.update()}.bind(this)),t.on(u.QUALITY_SELECTED,function(n,e){this.setSelectedSource(e)}.bind(this)),t.one("ready",function(){this.selectedSrc=t.src(),this.update()}.bind(this)),this.controlText("Open quality selector menu")},setSelectedSource:function(n){var e=n?n.src:void 0;this.selectedSrc!==e&&(this.selectedSrc=e,i.each(this.items,function(n){n.selected(n.source.src===e)}))},createItems:function(){var e=this.player(),n=e.currentSources();return n=n.filter(function(n){return null==n.hidequalityoption}),i.map(n,function(n){return new t(e,{source:n,selected:n.src===this.selectedSrc})}.bind(this))},buildWrapperCSSClass:function(){return"vjs-quality-selector "+r.prototype.buildWrapperCSSClass.call(this)}}),n.registerComponent("QualitySelector",e),e}},{"../events":5,"./QualityOption":3,underscore:2}],5:[function(n,e,t){"use strict";e.exports={QUALITY_REQUESTED:"qualityRequested",QUALITY_SELECTED:"qualitySelected",PLAYER_SOURCES_CHANGED:"playerSourcesChanged"}},{}],6:[function(n,e,t){"use strict";var c=n("underscore"),r=n("./events"),i=n("./components/QualitySelector"),u=n("./middleware/SourceInterceptor"),a=n("./util/SafeSeek");e.exports=function(n){n=n||window.videojs,i(n),u(n),n.hook("setup",function(o){o.on(r.QUALITY_REQUESTED,function(n,e){var t=o.currentSources(),r=o.currentTime(),i=o.playbackRate(),u=o.paused();c.each(t,function(n){n.selected=!1}),c.findWhere(t,{src:e.src}).selected=!0,o._qualitySelectorSafeSeek&&o._qualitySelectorSafeSeek.onQualitySelectionChange(),o.src(t),o.ready(function(){o._qualitySelectorSafeSeek&&!o._qualitySelectorSafeSeek.hasFinished()||(o._qualitySelectorSafeSeek=new a(o,r),o.playbackRate(i)),u||o.play()})})})},e.exports.EVENTS=r},{"./components/QualitySelector":4,"./events":5,"./middleware/SourceInterceptor":7,"./util/SafeSeek":9,underscore:2}],7:[function(n,e,t){"use strict";var u=n("underscore"),o=n("../events");e.exports=function(n){n.use("*",function(i){return{setSource:function(n,e){var t,r=i.currentSources();i._qualitySelectorSafeSeek&&i._qualitySelectorSafeSeek.onPlayerSourcesChange(),u.isEqual(r,i._qualitySelectorPreviousSources)||(i.trigger(o.PLAYER_SOURCES_CHANGED,r),i._qualitySelectorPreviousSources=r),t=u.find(r,function(n){return!0===n.selected||"true"===n.selected||"selected"===n.selected})||n,i.trigger(o.QUALITY_SELECTED,t),e(null,t)}}})}},{"../events":5,underscore:2}],8:[function(n,e,t){"use strict";n("./index")()},{"./index":6}],9:[function(n,e,t){"use strict";var r=n("class.extend");e.exports=r.extend({init:function(n,e){this._player=n,this._seekToTime=e,this._hasFinished=!1,this._keepThisInstanceWhenPlayerSourcesChange=!1,this._seekWhenSafe()},_seekWhenSafe:function(){this._player.readyState()<3?(this._seekFn=this._seek.bind(this),this._player.one("canplay",this._seekFn)):this._seek()},onPlayerSourcesChange:function(){this._keepThisInstanceWhenPlayerSourcesChange?this._keepThisInstanceWhenPlayerSourcesChange=!1:this.cancel()},onQualitySelectionChange:function(){this.hasFinished()||(this._keepThisInstanceWhenPlayerSourcesChange=!0)},_seek:function(){this._player.currentTime(this._seekToTime),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0},hasFinished:function(){return this._hasFinished},cancel:function(){this._player.off("canplay",this._seekFn),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0}})},{"class.extend":1}]},{},[8]); + //# sourceMappingURL=silvermine-videojs-quality-selector.min.js.map +\ No newline at end of file +diff --git a/src/invidious/routes/api/manifest.cr b/src/invidious/routes/api/manifest.cr +index ca429df55..23d11f65f 100644 +--- a/src/invidious/routes/api/manifest.cr ++++ b/src/invidious/routes/api/manifest.cr +@@ -56,7 +56,7 @@ module Invidious::Routes::API::Manifest + xml.element("Period") do + i = 0 + +- {"audio/mp4", "audio/webm"}.each do |mime_type| ++ {"audio/mp4"}.each do |mime_type| + mime_streams = audio_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type } + next if mime_streams.empty? + +@@ -83,7 +83,7 @@ module Invidious::Routes::API::Manifest + + potential_heights = {4320, 2160, 1440, 1080, 720, 480, 360, 240, 144} + +- {"video/mp4", "video/webm"}.each do |mime_type| ++ {"video/mp4"}.each do |mime_type| + mime_streams = video_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type } + next if mime_streams.empty? + +diff --git a/src/invidious/views/components/player.ecr b/src/invidious/views/components/player.ecr +index 206ba380e..fffefc9a3 100644 +--- a/src/invidious/views/components/player.ecr ++++ b/src/invidious/views/components/player.ecr +@@ -7,8 +7,19 @@ + + <% else %> + <% if params.listen %> +- <% audio_streams.each_with_index do |fmt, i| %> +- <% if params.local %>&local=true<% end %>" type='<%= fmt["mimeType"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>"> ++ <% audio_streams.each_with_index do |fmt, i| ++ src_url = "/latest_version?id=#{video.id}&itag=#{fmt["itag"]}" ++ src_url += "&local=true" if params.local ++ ++ bitrate = fmt["bitrate"] ++ mimetype = HTML.escape(fmt["mimeType"].as_s) ++ ++ selected = i == 0 ? true : false ++ %> ++ ++ <% if !params.local && !CONFIG.disabled?("local") %> ++ ++ <% end %> + <% end %> + <% else %> + <% if params.quality == "dash" %> +@@ -28,6 +39,9 @@ + selected = params.quality ? (params.quality == quality) : (i == 0) + %> + ++ <% if !params.local && !CONFIG.disabled?("local") %> ++ ++ <% end %> + <% end %> + <% end %> + +diff --git a/src/invidious/views/embed.ecr b/src/invidious/views/embed.ecr +index 27a8e2668..ce5ff7f01 100644 +--- a/src/invidious/views/embed.ecr ++++ b/src/invidious/views/embed.ecr +@@ -24,7 +24,8 @@ + "video_series" => video_series, + "params" => params, + "preferences" => preferences, +- "premiere_timestamp" => video.premiere_timestamp.try &.to_unix ++ "premiere_timestamp" => video.premiere_timestamp.try &.to_unix, ++ "local_disabled" => CONFIG.disabled?("local") + }.to_pretty_json + %> + +diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr +index 0e4af3ab9..2e493f4cc 100644 +--- a/src/invidious/views/watch.ecr ++++ b/src/invidious/views/watch.ecr +@@ -64,7 +64,8 @@ we're going to need to do it here in order to allow for translations. + "preferences" => preferences, + "premiere_timestamp" => video.premiere_timestamp.try &.to_unix, + "vr" => video.is_vr, +- "projection_type" => video.projection_type ++ "projection_type" => video.projection_type, ++ "local_disabled" => CONFIG.disabled?("local") + }.to_pretty_json + %> + +diff --git a/videojs-dependencies.yml b/videojs-dependencies.yml +index 6de23d257..e9ccc9dde 100644 +--- a/videojs-dependencies.yml ++++ b/videojs-dependencies.yml +@@ -1,9 +1,7 @@ +-# Due to an firefox issue, we're stuck on 7.11.0. If you're hosting a private instance +-# and you're using a chromium based browser, feel free to bump this to the latest version +-# in order to get support for higher resolutions on more videos. ++# Due to a 'video append of' error (see #3011), we're stuck on 7.12.1. + video.js: +- version: 7.11.0 +- shasum: e20747d890716085e7255a90d73c00f32324a224 ++ version: 7.12.1 ++ shasum: 1d12eeb1f52e3679e8e4c987d9b9eb37e2247fa2 + + videojs-contrib-quality-levels: + version: 2.1.0