aboutsummaryrefslogtreecommitdiffstats
path: root/youtube
diff options
context:
space:
mode:
Diffstat (limited to 'youtube')
-rw-r--r--youtube/static/js/common.js4
-rw-r--r--youtube/static/js/hotkeys.js2
-rw-r--r--youtube/static/js/sponsorblock.js40
-rw-r--r--youtube/templates/base.html4
-rw-r--r--youtube/templates/watch.html15
5 files changed, 57 insertions, 8 deletions
diff --git a/youtube/static/js/common.js b/youtube/static/js/common.js
index 2db4390..42fa41f 100644
--- a/youtube/static/js/common.js
+++ b/youtube/static/js/common.js
@@ -108,6 +108,10 @@ function copyTextToClipboard(text) {
document.body.removeChild(textArea);
}
+function getVideoID() {
+ return JSON.parse(Q(".video-info input[name=video_info_list]").value).id
+}
+
window.addEventListener('DOMContentLoaded', function() {
cur_track_idx = getDefaultTranscriptTrackIdx();
diff --git a/youtube/static/js/hotkeys.js b/youtube/static/js/hotkeys.js
index 5688ef3..1f41510 100644
--- a/youtube/static/js/hotkeys.js
+++ b/youtube/static/js/hotkeys.js
@@ -37,7 +37,7 @@ function onKeyDown(e) {
else tt.mode = "showing";
}
else if (c == "t") {
- let video_id = JSON.parse(Q(".video-info input[name=video_info_list]").value).id
+ let video_id = getVideoID();
let ts = Math.floor(Q("video").currentTime);
copyTextToClipboard(`https://youtu.be/${video_id}?t=${ts}`);
}
diff --git a/youtube/static/js/sponsorblock.js b/youtube/static/js/sponsorblock.js
new file mode 100644
index 0000000..66dcf16
--- /dev/null
+++ b/youtube/static/js/sponsorblock.js
@@ -0,0 +1,40 @@
+"use strict";
+
+// from: https://git.gir.st/subscriptionfeed.git/blob/59a590d:/app/youtube/templates/watch.html.j2#l28
+
+var sha256=function a(b){function c(a,b){return a>>>b|a<<32-b}for(var d,e,f=Math.pow,g=f(2,32),h="length",i="",j=[],k=8*b[h],l=a.h=a.h||[],m=a.k=a.k||[],n=m[h],o={},p=2;64>n;p++)if(!o[p]){for(d=0;313>d;d+=p)o[d]=p;l[n]=f(p,.5)*g|0,m[n++]=f(p,1/3)*g|0}for(b+="\x80";b[h]%64-56;)b+="\x00";for(d=0;d<b[h];d++){if(e=b.charCodeAt(d),e>>8)return;j[d>>2]|=e<<(3-d)%4*8}for(j[j[h]]=k/g|0,j[j[h]]=k,e=0;e<j[h];){var q=j.slice(e,e+=16),r=l;for(l=l.slice(0,8),d=0;64>d;d++){var s=q[d-15],t=q[d-2],u=l[0],v=l[4],w=l[7]+(c(v,6)^c(v,11)^c(v,25))+(v&l[5]^~v&l[6])+m[d]+(q[d]=16>d?q[d]:q[d-16]+(c(s,7)^c(s,18)^s>>>3)+q[d-7]+(c(t,17)^c(t,19)^t>>>10)|0),x=(c(u,2)^c(u,13)^c(u,22))+(u&l[1]^u&l[2]^l[1]&l[2]);l=[w+x|0].concat(l),l[4]=l[4]+w|0}for(d=0;8>d;d++)l[d]=l[d]+r[d]|0}for(d=0;8>d;d++)for(e=3;e+1;e--){var y=l[d]>>8*e&255;i+=(16>y?0:"")+y.toString(16)}return i}; /*https://geraintluff.github.io/sha256/sha256.min.js (public domain)*/
+
+window.addEventListener("load", load_sponsorblock);
+document.addEventListener('DOMContentLoaded', ()=>{
+ const check = document.querySelector("#skip_sponsors");
+ check.addEventListener("change", () => {if (check.checked) load_sponsorblock()});
+});
+function load_sponsorblock(){
+ const info_elem = Q('#skip_n');
+ if (info_elem.innerText.length) return; // already fetched
+ const video_id = getVideoID();
+ const hash = sha256(video_id).substr(0,4);
+ const video_obj = Q("video");
+ fetch(`https://sponsor.ajay.app/api/skipSegments/${hash}`)
+ .then(response => response.json())
+ .then(data => {
+ for (const video of data) {
+ if (video.videoID != video_id) continue;
+ info_elem.innerText = `(${video.segments.length} segments)`;
+ const cat_n = video.segments.map(e=>e.category).sort()
+ .reduce((acc,e) => (acc[e]=(acc[e]||0)+1, acc), {});
+ info_elem.title = Object.entries(cat_n).map(e=>e.join(': ')).join(', ');
+ for (const segment of video.segments) {
+ const [start, stop] = segment.segment;
+ if (segment.category != "sponsor") continue;
+ video_obj.addEventListener("timeupdate", function() {
+ if (Q("#skip_sponsors").checked &&
+ this.currentTime >= start &&
+ this.currentTime < stop-1) {
+ this.currentTime = stop;
+ }
+ });
+ }
+ }
+ });
+} \ No newline at end of file
diff --git a/youtube/templates/base.html b/youtube/templates/base.html
index f325f86..df7bb99 100644
--- a/youtube/templates/base.html
+++ b/youtube/templates/base.html
@@ -4,7 +4,9 @@
<meta charset="utf-8">
<title>{{ page_title }}</title>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline'; media-src 'self' https://*.googlevideo.com;
- {{ "img-src https://*.googleusercontent.com https://*.ggpht.com https://*.ytimg.com;" if not settings.proxy_images else "" }}">
+ {{ "img-src https://*.googleusercontent.com https://*.ggpht.com https://*.ytimg.com;" if not settings.proxy_images else "" }}
+ {{ "" if not settings.use_sponsorblock_js else "connect-src 'self' https://sponsor.ajay.app;"|safe }}">
+
<link href="{{ theme_path }}" type="text/css" rel="stylesheet">
<link href="/youtube.com/static/shared.css" type="text/css" rel="stylesheet">
<link href="/youtube.com/static/comments.css" type="text/css" rel="stylesheet">
diff --git a/youtube/templates/watch.html b/youtube/templates/watch.html
index 86644ea..d89cc05 100644
--- a/youtube/templates/watch.html
+++ b/youtube/templates/watch.html
@@ -494,6 +494,12 @@ Reload without invidious (for usage of new identity button).</a>
<p>Used Invidious as fallback.</p>
{% endif %}
<p class="allowed-countries">Allowed countries: {{ allowed_countries|join(', ') }}</p>
+
+ {% if settings.use_sponsorblock_js %}
+ <ul class="more-actions">
+ <li><label><input type=checkbox id=skip_sponsors checked>skip sponsors</label> <span id=skip_n></span>
+ </ul>
+ {% endif %}
</div>
</details>
</div>
@@ -691,10 +697,7 @@ Reload without invidious (for usage of new identity button).</a>
<script src="/youtube.com/static/js/common.js"></script>
<script src="/youtube.com/static/js/transcript-table.js"></script>
- {% if settings.use_video_hotkeys %}
- <script src="/youtube.com/static/js/hotkeys.js"></script>
- {% endif %}
- {% if settings.use_comments_js %}
- <script src="/youtube.com/static/js/comments.js"></script>
- {% endif %}
+ {% if settings.use_video_hotkeys %} <script src="/youtube.com/static/js/hotkeys.js"></script> {% endif %}
+ {% if settings.use_comments_js %} <script src="/youtube.com/static/js/comments.js"></script> {% endif %}
+ {% if settings.use_sponsorblock_js %} <script src="/youtube.com/static/js/sponsorblock.js"></script> {% endif %}
{% endblock main %}