Compare commits

..

375 Commits

Author SHA1 Message Date
Ajay Ramachandran
f0888faf78 Merge pull request #133 from ajayyy/experimental
Update master
2019-08-23 23:30:11 -04:00
Ajay Ramachandran
9951a19478 Updated version number. 2019-08-23 23:27:42 -04:00
Ajay Ramachandran
dd4ab2f38a Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into experimental 2019-08-23 21:13:37 -04:00
Ajay Ramachandran
227bec4d8e Merge pull request #83 from OfficialNoob/patch-16
Added youtube-nocookie.com
2019-08-23 21:13:03 -04:00
Ajay Ramachandran
556b4f88d2 Merge pull request #122 from OfficialNoob/patch-21
Added addButtons
2019-08-23 21:11:04 -04:00
Ajay Ramachandran
f0e1979aab Renamed addButtons and defined controls. 2019-08-23 21:03:43 -04:00
Ajay Ramachandran
989db6d6b6 Added more spacing. 2019-08-23 21:02:17 -04:00
Ajay Ramachandran
781096c290 Fixed cut off text. 2019-08-23 21:01:31 -04:00
Ajay Ramachandran
536c6e3e41 Removed new line from messages. 2019-08-23 21:00:07 -04:00
Ajay Ramachandran
de376176db Fixed preview bar being added too soon. 2019-08-23 20:59:13 -04:00
Ajay Ramachandran
e63389cfa3 Fixed buttons appearing too early not hidden (submit and clear button). 2019-08-23 20:52:12 -04:00
Ajay Ramachandran
1c4ca8da26 Fixed formatting issues + previewBar not displaying.
Also changed the isSubmitButtonLoaded function to be checking for the right button and fixed the startSponsorButton not hiding.

Useless function was removed.
2019-08-23 20:50:10 -04:00
Ajay Ramachandran
dcbd7ba4cd Merge pull request #132 from ajayyy/experimental-ajay
More checks + popup fix
2019-08-23 20:31:29 -04:00
Ajay Ramachandran
9fc8d385ab Fixed popup getting cut off. 2019-08-23 14:23:34 -04:00
Ajay Ramachandran
07e878e065 Fixed missing language call. 2019-08-23 14:22:16 -04:00
Official Noob
a2af4dba52 Added back getYouTubeVideoStartTime 2019-08-23 17:19:44 +01:00
Ajay Ramachandran
2fbafb6b10 Added duration check to popup as well. 2019-08-22 23:12:30 -04:00
Ajay Ramachandran
98eb72ef1f Made sure rechecks didn't happen twice. 2019-08-22 22:43:55 -04:00
Ajay Ramachandran
89d127c5c5 Added a check to make sure the time doesn't exceed the duration of the video. 2019-08-22 22:43:19 -04:00
Ajay Ramachandran
a784c8a850 Merge pull request #130 from doubouil/patch-1
Better french translation
2019-08-22 21:29:45 -04:00
Ajay Ramachandran
a533aaf5cf Updated French translation 2019-08-22 21:28:52 -04:00
doubouil
434b5bdbad Better french translation
Native speaker here, the machine based translation was not great so here's a first draft.
I choose to use "message commercial" (commercial message) and not "publicité" (advertisement) since ads feels to me to be more a legal status than a definite thing. "Endossement" is not a valid french word in this context, and endorsements would be translated to "sponsors" or "mécénat" in fr_FR, but again this are more legal category than pure identifying terms and fr_CA strongly dislikes frenglish.
But I left it in the extension name since this is a good keyword for people looking for adblocking-related extensions.
2019-08-22 21:10:41 +00:00
Ajay Ramachandran
d1f1f9213e Merge pull request #129 from ajayyy/experimental-ajay
UserID undefined checks
2019-08-22 16:10:50 -04:00
Ajay Ramachandran
d498c107a8 Update version number. 2019-08-22 16:08:38 -04:00
Ajay Ramachandran
f12b44762e Added new check to setup a proper userID if undefined while voting. 2019-08-22 16:08:16 -04:00
Official Noob
fc4da038e9 Merge branch 'experimental' into patch-21 2019-08-22 19:48:59 +01:00
Official Noob
d5999ad330 Added isDraggable 2019-08-22 19:39:17 +01:00
Official Noob
146ece3bff Fixed JSON error 2019-08-22 19:36:30 +01:00
Ajay Ramachandran
92095acf36 Merge pull request #128 from Revadike/fix-draggable
Disallow dragging of button
2019-08-22 12:34:18 -04:00
Revadike
279c10d555 Disallow dragging of button 2019-08-22 15:52:45 +02:00
Ajay Ramachandran
0ae3820681 Merge pull request #127 from ajayyy/experimental
Update master
2019-08-21 20:01:43 -04:00
Ajay Ramachandran
283e4d053e Merge pull request #126 from ajayyy/experimental-ajay
Translations + Unsubmitted sponsor preview
2019-08-21 20:01:18 -04:00
Ajay Ramachandran
6dbb2f9d10 Update version number. 2019-08-21 19:58:44 -04:00
Ajay Ramachandran
c657bb763b Merge branch 'experimental' of https://github.com/ajayyy/SponsorBlock into experimental-ajay 2019-08-21 19:57:40 -04:00
Ajay Ramachandran
259cdb1abe Merge pull request #123 from bershanskiy/russian
Russian translation
2019-08-21 19:57:30 -04:00
Ajay Ramachandran
86e96e59af Update README.md 2019-08-21 19:21:06 -04:00
Official Noob
9ba30dbafa Moved to bottom 2019-08-21 20:21:39 +01:00
Anton Bershanskiy
2907db705c Update messages.json 2019-08-21 14:03:46 -05:00
Ajay Ramachandran
a6a0f917e0 Fixed preview not working when no sponsors are found. 2019-08-21 14:35:46 -04:00
Official Noob
bcdba798d9 Added locals for buttons 2019-08-21 19:29:24 +01:00
Ajay Ramachandran
32884372fa Unsubmitted sponsors are now in the preview. 2019-08-21 14:27:25 -04:00
Official Noob
9b2364cfb7 fixed isSubmitLoaded 2019-08-21 19:22:59 +01:00
Ajay Ramachandran
c1aebf45c8 Removed the need for getYouTubeVideoStartTime and made it check the current video time instead. 2019-08-21 14:16:52 -04:00
Official Noob
6e0c6332cc Fixed title in createButton 2019-08-21 19:15:35 +01:00
Official Noob
47d0d340d4 Requested changes 2019-08-21 19:10:49 +01:00
Ajay Ramachandran
118804e139 Added confirm language to translations. Increased size of notice. Updated translations. 2019-08-21 14:04:05 -04:00
Ajay Ramachandran
0bef50e259 Merge pull request #121 from OfficialNoob/patch-18
Added wait function
2019-08-21 13:47:57 -04:00
Official Noob
bfb876af8b Changed button exists check 2019-08-21 18:29:41 +01:00
Official Noob
84d5d3124c Update content.js 2019-08-21 18:17:30 +01:00
Official Noob
825d997d6d Update content.js 2019-08-20 23:37:40 +01:00
Official Noob
8e9e5bfddb Update content.js 2019-08-20 23:26:35 +01:00
Official Noob
05765682a5 Update content.js 2019-08-20 23:11:18 +01:00
Official Noob
2b5d56942a Update content.js 2019-08-20 22:59:34 +01:00
Ajay Ramachandran
f097ff60aa Fixed indentation 2019-08-20 17:47:31 -04:00
Anton Bershanskiy
655691a28f Russian translation 2019-08-20 15:10:21 -05:00
Ajay Ramachandran
7ddef8d519 Update README.md 2019-08-20 16:09:47 -04:00
Ajay Ramachandran
2fb79f0066 Update README.md 2019-08-20 16:09:22 -04:00
Ajay Ramachandran
655d87ce0f Update README.md 2019-08-20 16:08:27 -04:00
Ajay Ramachandran
ed7c98afa8 Update README.md 2019-08-20 16:06:29 -04:00
Ajay Ramachandran
41bf0c9697 Update README.md 2019-08-20 16:05:47 -04:00
Ajay Ramachandran
5eb0132660 Update README.md 2019-08-20 16:05:25 -04:00
Ajay Ramachandran
c43695e596 Update README.md 2019-08-20 16:04:47 -04:00
Ajay Ramachandran
9aeda25136 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into experimental 2019-08-20 15:54:51 -04:00
Ajay Ramachandran
90e671ebf8 Updated french translation 2019-08-20 15:54:40 -04:00
Ajay Ramachandran
3ecc180d06 Added french translation + fixed i18n not being used for the notification. 2019-08-20 15:46:00 -04:00
Official Noob
7ac9ec37ef Adding addButtons and using sponsorVideoID more 2019-08-20 20:27:30 +01:00
Ajay Ramachandran
e176a9f241 Fixed it linking to non existent file 2019-08-20 15:07:36 -04:00
Ajay Ramachandran
91bd910c40 Added Brazilian Portuguese translation by @Geroyuni
Co-authored-by: Geroyuni <Geroyuni@users.noreply.github.com>
2019-08-20 15:04:13 -04:00
Official Noob
a6c77185de Added wait function 2019-08-20 17:46:05 +01:00
Ajay Ramachandran
b871d721db Update version number. 2019-08-19 22:27:42 -04:00
Ajay Ramachandran
85f9bb1d34 Removed setInterval when removing the notice. 2019-08-19 22:26:49 -04:00
Ajay Ramachandran
adb60c6357 Update README.md 2019-08-19 20:57:31 -04:00
Ajay Ramachandran
90046aed53 Merge pull request #120 from ajayyy/experimental-ajay
Update version number
2019-08-19 20:25:52 -04:00
Ajay Ramachandran
7adef119d3 Update version number 2019-08-19 20:23:42 -04:00
Ajay Ramachandran
4db6593681 Merge branch 'experimental' of https://github.com/ajayyy/SponsorBlock into experimental 2019-08-19 20:20:08 -04:00
Ajay Ramachandran
f4c7e11ae1 Merge pull request #119 from ajayyy/experimental-ajay
Notice countdown counter, reskip, formatting fixes + sponsor check fixes
2019-08-19 20:19:48 -04:00
Ajay Ramachandran
b1393a563f Added language support to setUsername. Fixed error messages not appearing. Reset error messages properly.
Resolves https://github.com/ajayyy/SponsorBlock/issues/111
2019-08-19 20:17:32 -04:00
Ajay Ramachandran
279e49a143 Fixed more indentation 2019-08-19 20:05:33 -04:00
Ajay Ramachandran
db4182d074 Fixed indentation 2019-08-19 19:21:19 -04:00
Ajay Ramachandran
cc2d1405b6 Made the notice id suffix not just the sponsor UUID. 2019-08-19 19:19:33 -04:00
Ajay Ramachandran
19802a7a31 Made the notice stay open after an unskip and allow to reskip.
The time remaining of the popup becomes the time remaining of the sponsor.
2019-08-19 19:07:14 -04:00
Ajay Ramachandran
50f929c11a Adjusted fade out animation to feel much better 2019-08-19 17:57:10 -04:00
Ajay Ramachandran
e5e250ff36 Added fade out animation 2019-08-19 17:39:22 -04:00
Ajay Ramachandran
6fe94a70a7 Countdown timer now pauses after hovering.
Also lowered countdown time.
2019-08-19 17:24:17 -04:00
Ajay Ramachandran
db2af83a34 Added countdown to skip notice 2019-08-19 17:08:31 -04:00
Ajay Ramachandran
cbab026f27 Added new button backgrounds. Centered report button 2019-08-19 16:49:22 -04:00
Ajay Ramachandran
0c2c868e5c Made report text disappear after voting. 2019-08-19 16:13:18 -04:00
Ajay Ramachandran
175cf62201 Refractored skipNotice to use a class now 2019-08-19 16:09:54 -04:00
Ajay Ramachandran
761ae63845 Fixed css issues on old YouTube on the notice. 2019-08-19 12:11:19 -04:00
Ajay Ramachandran
70948d9b36 Update version number 2019-08-15 23:56:35 -04:00
Ajay Ramachandran
3e0638d811 Updated sponsor check to support slower PCs 2019-08-15 15:16:24 -04:00
Ajay Ramachandran
096bf0d750 Merge pull request #118 from ajayyy/experimental-ajay
Report button additions
2019-08-15 11:26:01 -04:00
Ajay Ramachandran
c81d4cc2a1 Update version number 2019-08-15 11:23:38 -04:00
Ajay Ramachandran
628f1043fa Added text to the report button. 2019-08-15 11:23:19 -04:00
Ajay Ramachandran
73b8d82b0f Made view count tracking work when the notice is disabled 2019-08-15 11:12:46 -04:00
Ajay Ramachandran
d6ba6c83e8 Update README.md 2019-08-15 00:54:45 -04:00
Ajay Ramachandran
3c56bc49fd Merge pull request #117 from ajayyy/experimental-ajay
Updated help page
2019-08-14 22:22:40 -04:00
Ajay Ramachandran
1697bf5e6a Updated help page 2019-08-14 22:22:19 -04:00
Ajay Ramachandran
960bca13d4 Merge pull request #116 from ajayyy/experimental
New notice + language support + preview fixes
2019-08-14 22:18:49 -04:00
Ajay Ramachandran
ccf6d8dd8f Merge pull request #115 from ajayyy/experimental-ajay
Added new notice and new only downvote behavior
2019-08-14 22:17:59 -04:00
Ajay Ramachandran
6822fa9a67 Merge branch 'experimental' of https://github.com/ajayyy/SponsorBlock into experimental-ajay 2019-08-14 22:09:59 -04:00
Ajay Ramachandran
2266df88d5 Update version number 2019-08-14 22:09:50 -04:00
Ajay Ramachandran
5d075a6be4 Made autovote only happen if view counting is enabled 2019-08-14 22:08:23 -04:00
Ajay Ramachandran
215098f647 Added new text values to translation file. 2019-08-14 21:53:38 -04:00
Ajay Ramachandran
a7f3701272 Made it auto vote when a sponsor is skipped 2019-08-14 21:50:32 -04:00
Ajay Ramachandran
08b8b63678 Removed need for important tag 2019-08-14 21:46:30 -04:00
Ajay Ramachandran
d550bb6b7f Revert upvote and downvote buttons 2019-08-14 21:33:32 -04:00
Ajay Ramachandran
edb577cf5b Changed popup to only use report button instead of upvote and downvote + improved popup. 2019-08-14 21:30:02 -04:00
Ajay Ramachandran
739548d169 Changed alignment and switched icons 2019-08-14 14:07:00 -04:00
Ajay Ramachandran
2e2e5d136a Added explanation about the username 2019-08-14 13:56:19 -04:00
Ajay Ramachandran
b1ce20cd5a Added basic features for the new voting UI 2019-08-13 23:43:02 -04:00
Ajay Ramachandran
2431f44a29 Merge pull request #114 from ajayyy/experimental-ajay
Made preview bar update more and made the sponsor times reset more.
2019-08-13 21:10:48 -04:00
Ajay Ramachandran
0e4d95dca7 Made preview bar update more and made the sponsor times reset more. 2019-08-13 19:18:53 -04:00
Ajay Ramachandran
5ee80d6e50 Merge pull request #113 from ajayyy/experimental-ajay
Fixes for #86 and better preview bar
2019-08-13 18:58:15 -04:00
Ajay Ramachandran
bfd841486e Fixed incorrect message and changed formatting 2019-08-13 18:55:50 -04:00
Ajay Ramachandran
29da12ec71 Updated popup title 2019-08-13 18:49:55 -04:00
Ajay Ramachandran
d89238f76b Changed to not change popup HTML file based on language 2019-08-13 18:44:47 -04:00
Ajay Ramachandran
57f076c5d3 Removed debug log 2019-08-13 18:40:46 -04:00
Ajay Ramachandran
ea41980fc6 Merge branch 'experimental' of https://github.com/ajayyy/SponsorBlock into experimental-ajay
# Conflicts:
#	manifest.json
2019-08-13 18:23:56 -04:00
Ajay Ramachandran
33954aafaf Merge pull request #86 from OfficialNoob/patch-18
Multilingual support [TESTING]
2019-08-13 18:12:37 -04:00
OfficialNoob
a10b4ab06e Fix merge error 2019-08-13 22:14:45 +01:00
OfficialNoob
f350f18190 Fixed code problems 2019-08-13 22:05:39 +01:00
Ajay Ramachandran
60fc61560d Added leaderboard link 2019-08-13 14:39:20 -04:00
Ajay Ramachandran
fadb294c98 Made the preview bar only get created if a video is found. 2019-08-13 14:05:32 -04:00
Ajay Ramachandran
137ba895bb Merge pull request #110 from ajayyy/experimental
Update master
2019-08-13 13:06:10 -04:00
Ajay Ramachandran
ecc48de396 Merge pull request #109 from ajayyy/experimental-ajay
Fixed preview bar
2019-08-13 13:05:52 -04:00
Ajay Ramachandran
aa95687b56 Update version number 2019-08-13 13:03:08 -04:00
Ajay Ramachandran
a8147738ef Raised retry limit for when the server is down. 2019-08-13 13:02:54 -04:00
Ajay Ramachandran
4a3d36b952 Fixed preview bar.
Made it reset when no sponsors are found.

Made it wait until the video metadata is loaded if necessary.
2019-08-13 13:02:35 -04:00
Ajay Ramachandran
f9bd82db35 Merge pull request #103 from OfficialNoob/patch-20
Added switch for chrome.runtime.onMessage
2019-08-13 00:32:43 -04:00
Ajay Ramachandran
c8438b9d59 Updated formatting 2019-08-13 00:32:33 -04:00
Ajay Ramachandran
5347340c1c Merge pull request #107 from ajayyy/experimental-ajay
Preview bar, downvote to hide sponsor, usernames
2019-08-12 23:44:53 -04:00
Ajay Ramachandran
524e443f4d Updated build number 2019-08-12 23:44:14 -04:00
Ajay Ramachandran
b9091c3a97 Made it get the current username when letting you edit it. 2019-08-12 23:32:10 -04:00
Ajay Ramachandran
5445146b56 Added ability to set your username 2019-08-12 23:20:35 -04:00
Ajay Ramachandran
13d0e4a33a Made it still possible to vote on downvoted sponsors.
Added "(hidden)" to the button.

Resolves https://github.com/ajayyy/SponsorBlock/issues/28
2019-08-12 20:22:00 -04:00
Ajay Ramachandran
8f0a9d97f6 Downvoting now temporarily hides the sponsor time. 2019-08-12 20:00:42 -04:00
Ajay Ramachandran
5feed6bfcc Added preview bar with the sponsors 2019-08-12 19:34:44 -04:00
Official Noob
e8246a9a8a Added new stuff 2019-08-12 22:29:15 +01:00
Official Noob
e141b1f4e8 Update manifest.json 2019-08-12 22:28:41 +01:00
Official Noob
f9fcd80552 CC 2019-08-12 22:28:07 +01:00
Official Noob
8c7d749f11 CC 2019-08-12 22:15:25 +01:00
Official Noob
bcc927f21a CC 2019-08-12 22:10:33 +01:00
Official Noob
b13837ce44 CC 2019-08-12 22:07:24 +01:00
Official Noob
806456d287 added helpPage 2019-08-12 21:45:14 +01:00
Official Noob
2deb2ff4b5 added helpPage 2019-08-12 21:43:34 +01:00
Official Noob
fb1836cd07 Rename popup.html to popup_en.html 2019-08-12 21:41:40 +01:00
Official Noob
f2036885aa Update manifest.json 2019-08-12 21:41:16 +01:00
Official Noob
948293db04 added popup 2019-08-12 21:40:23 +01:00
Official Noob
5031a85a5c Update background.js 2019-08-12 21:38:44 +01:00
Official Noob
a5e3dcaf4d Update background.js 2019-08-12 21:34:03 +01:00
Official Noob
37816ba762 Rename index.html to index_en.html 2019-08-12 21:30:02 +01:00
Official Noob
ed9a445b4c browser.i18n -> chrome.i18n 2019-08-12 21:25:03 +01:00
Official Noob
0b801ae986 browser.i18n -> chrome.i18n 2019-08-12 21:23:11 +01:00
Ajay Ramachandran
5916baf5ea Merge pull request #105 from ajayyy/experimental
Lowered permissions + Edit panel additions
2019-08-12 16:05:28 -04:00
Official Noob
afa260b733 Merge branch 'experimental' into patch-18 2019-08-12 21:02:55 +01:00
Ajay Ramachandran
1c3a857fcf Merge pull request #104 from ajayyy/experimental-ajay
Edit panel additions
2019-08-12 16:01:56 -04:00
Ajay Ramachandran
640ad58c65 Updated version number 2019-08-12 15:59:06 -04:00
Ajay Ramachandran
41aa58e004 Fixed userIDs not being properly submitted. 2019-08-12 15:58:25 -04:00
Ajay Ramachandran
6b3eb09198 Added button to set edit to the current time. 2019-08-12 15:27:35 -04:00
Official Noob
59c2e5cae7 i18n 2019-08-12 20:10:13 +01:00
Official Noob
a30c7cf383 Update messages.json 2019-08-12 20:08:26 +01:00
Official Noob
334e32fb6b i18n 2019-08-12 19:47:11 +01:00
Official Noob
7a36277695 added connectionError 2019-08-12 19:46:25 +01:00
Official Noob
9a2bce4ba6 Added Segment 2019-08-12 19:35:08 +01:00
Official Noob
71d2231fb5 Update messages.json 2019-08-12 18:41:45 +01:00
Official Noob
cc3f970aef Internationalization 2019-08-12 18:40:16 +01:00
Official Noob
189a28f027 added fullName 2019-08-12 18:36:02 +01:00
Official Noob
a2750ad709 Fixed JSON 2019-08-12 18:34:17 +01:00
Official Noob
c8341a448d Switched to native 2019-08-12 18:33:36 +01:00
Official Noob
44c4671977 Added switch for chrome.runtime.onMessage 2019-08-12 17:41:26 +01:00
Ajay Ramachandran
ac118173a5 Made preview also save the edit. 2019-08-12 12:26:52 -04:00
Ajay Ramachandran
3f815a18c4 Added a sponsor time preview.
It skips 2 seconds before the start time so you can preview how it feels.

Also increased the space between the times and the clear times button.

Resolves https://github.com/ajayyy/SponsorBlock/issues/66
2019-08-12 12:21:20 -04:00
Ajay Ramachandran
e281b90699 Fixed sponsor times not properly saving 2019-08-12 12:05:16 -04:00
Ajay Ramachandran
012a36b931 Increased button padding 2019-08-12 12:04:57 -04:00
Ajay Ramachandran
43e3d03e9a Added better error checking 2019-08-12 12:02:01 -04:00
Ajay Ramachandran
5adeeed634 Made editing not possible on unfinished sponsors.
Resolved https://github.com/ajayyy/SponsorBlock/issues/77
2019-08-12 11:42:39 -04:00
Ajay Ramachandran
29a8608f9d Merge pull request #90 from OfficialNoob/patch-19
Removed tabs permission
2019-08-12 11:36:57 -04:00
Official Noob
5347b9c935 Merge branch 'experimental' into patch-18 2019-08-12 15:59:25 +01:00
Official Noob
67c4acbc5e Removed videoID as now message active tab 2019-08-12 13:38:35 +01:00
Official Noob
a5d605f539 Removed videoID as now message active tab 2019-08-12 13:38:27 +01:00
Ajay Ramachandran
66b6985c5e Merge pull request #101 from ajayyy/experimental
Better lookups + userID generator improvements
2019-08-11 23:24:17 -04:00
Ajay Ramachandran
0025785a78 Updated version number 2019-08-11 23:22:20 -04:00
Ajay Ramachandran
ba284aec2f Merge pull request #100 from ajayyy/experimental-ajay
More lookups
2019-08-11 23:19:40 -04:00
Ajay Ramachandran
5ffe207a86 Made it retry a sponsor lookup each second if there is a connection error.
It will stop after 15 tries.
2019-08-11 23:18:50 -04:00
Ajay Ramachandran
3a4d867ae3 Made it check again for sponsors after submitting. 2019-08-11 23:13:07 -04:00
Ajay Ramachandran
7a2c57aae9 Merge pull request #73 from OfficialNoob/patch-13
Made UUID less predictable
2019-08-11 23:08:54 -04:00
Ajay Ramachandran
05faa7e138 Merge branch 'master' into patch-13 2019-08-11 23:07:27 -04:00
Ajay Ramachandran
455189d916 Merge pull request #99 from ajayyy/experimental-ajay
Update version number
2019-08-11 17:10:56 -04:00
Ajay Ramachandran
1c05de3098 Update version number 2019-08-11 17:10:40 -04:00
Ajay Ramachandran
577baa508b Merge pull request #98 from ajayyy/experimental
New background script and utils script
2019-08-11 17:10:08 -04:00
Ajay Ramachandran
aebb4313bc Merge pull request #97 from ajayyy/experimental-ajay
Fixed background not using serverAddress from config
2019-08-11 17:09:42 -04:00
Ajay Ramachandran
d42377a5cd Fixed background not using serverAddress from config. 2019-08-11 17:09:04 -04:00
Official Noob
f254a99d6f notifications 2019-08-11 21:21:04 +01:00
Official Noob
19a1a5efda Added alertPrevious message 2019-08-11 21:20:10 +01:00
Official Noob
28322f19b5 videoID 2019-08-11 19:36:52 +01:00
Official Noob
c7d03aa423 videoID 2019-08-11 19:32:44 +01:00
Official Noob
60242df3c9 Removed stuff thats in utils.js 2019-08-11 19:29:38 +01:00
Official Noob
1aab52edbe Remove userID 2019-08-11 19:27:38 +01:00
Ajay Ramachandran
2580577ce0 Added comments 2019-08-11 12:49:25 -04:00
Official Noob
1ab33375ec Update background.js 2019-08-11 13:51:59 +01:00
Official Noob
e1f5046ace Merge branch 'experimental' into patch-19 2019-08-11 13:38:00 +01:00
Ajay Ramachandran
699ca91a94 Made channel whitelisting properly work on first loaded video. 2019-08-10 22:04:32 -04:00
Ajay Ramachandran
30c12e3983 Reduced errors by getting if the channel is whitelisted after checking it is is a YouTube tab. 2019-08-10 20:57:11 -04:00
Ajay Ramachandran
15d6a48359 Fixed url object not being properly defined. 2019-08-10 20:53:43 -04:00
Ajay Ramachandran
b700d4eec0 Merge pull request #72 from OfficialNoob/patch-10
Added Utils file + Updated Parser
2019-08-10 19:57:11 -04:00
Ajay Ramachandran
5be8ecb32b Fixed up formatting and style. Added more detailed error messages. Changed from var to let.
Co-author worked on creating this url parser.

Co-Authored-By: Giacomo Rossetto <jackyman_cs4@live.it>
2019-08-10 19:55:39 -04:00
Ajay Ramachandran
ccafbf663c Fixed typos.
Co-author worked on creating this url parser.

Co-Authored-By: Giacomo Rossetto <jackyman_cs4@live.it>
2019-08-10 19:51:08 -04:00
Ajay Ramachandran
3f7e9e22ec Merge pull request #89 from bershanskiy/nonpersistent
Refactor: make background non-persistent
2019-08-10 19:38:29 -04:00
Ajay Ramachandran
e5d9c75392 Merge pull request #92 from bershanskiy/web_accessible_resources
Remove help/* from web_accessible_resources
2019-08-10 19:37:46 -04:00
Official Noob
b28087f723 Kind of better :/ 2019-08-09 11:34:08 +01:00
Official Noob
866cc33f0e Update content.js 2019-08-08 20:33:05 +01:00
Official Noob
02448307ab Update background.js 2019-08-08 20:32:18 +01:00
Anton Bershanskiy
b34b3f5651 Remove help/* from web_accessible_resources
Remove files in help/ directory from web_accessible_resources in manifest.json because the help page opens in context of the extension (no need to expose it to other contexts).
2019-08-08 14:21:42 -05:00
Anton Bershanskiy
7c787b77e8 Remove unnecessary changes 2019-08-08 14:17:33 -05:00
Official Noob
1b5d5f8a3a Added tab update back 2019-08-08 20:15:23 +01:00
Official Noob
6707d6df8d Added onUpdated back as did not work 2019-08-08 19:59:15 +01:00
Anton Bershanskiy
0c669d6b83 Fix: add migration path away from shownInstallPage 2019-08-08 13:29:09 -05:00
Official Noob
883871123a Update content.js 2019-08-08 19:26:26 +01:00
Official Noob
301e16b8f1 Removed tabUpdate as detecting in contentscript 2019-08-08 19:25:29 +01:00
Ajay Ramachandran
df1bc9d7a6 Merge pull request #91 from ajayyy/master
Update experimental
2019-08-08 13:40:22 -04:00
Official Noob
e1f1814748 Moved code from background.js 2019-08-08 17:03:58 +01:00
Official Noob
074f7c5456 Switched callback to onTabs 2019-08-08 16:50:33 +01:00
Official Noob
2a64afe9dc camelCase 2019-08-08 16:48:00 +01:00
Official Noob
4c12bb9c2f camelCase 2019-08-08 16:45:23 +01:00
Official Noob
22e7c6a40d Sync Video ID with Storage API 2019-08-08 14:44:48 +01:00
Official Noob
a9ea22f505 Get ID from storage API 2019-08-08 14:43:15 +01:00
Official Noob
2067b1c787 Removed unused lines 2019-08-08 14:04:21 +01:00
Official Noob
410f5fc138 Update background.js 2019-08-08 14:03:13 +01:00
Official Noob
077efd2de3 Moving to content script 2019-08-08 14:02:06 +01:00
Official Noob
62632792cc Removed tabs permission 2019-08-08 13:28:50 +01:00
Anton Bershanskiy
7e2925a1e3 Refactor: make background non-persistent 2019-08-08 00:24:30 -05:00
Official Noob
4c37bd24ac Update LANG.js 2019-08-07 18:12:04 +01:00
Official Noob
8e3a46d393 Update LANG.js 2019-08-07 17:45:56 +01:00
Official Noob
c7f8a39282 Update LANG.js 2019-08-07 17:45:10 +01:00
Official Noob
c09cff86b5 Update popup.js 2019-08-07 17:33:16 +01:00
Official Noob
24c61bab71 Auto detect lang 2019-08-07 17:15:57 +01:00
Official Noob
37df697b3d Added Utils for lang 2019-08-07 17:08:29 +01:00
Official Noob
86fee63a8b Moving into LANG 2019-08-07 17:04:50 +01:00
Official Noob
21b5fc9723 Added LANG.js 2019-08-07 16:59:57 +01:00
Official Noob
e5add6c392 Create LANG.js 2019-08-07 16:55:47 +01:00
Official Noob
b964d93ea9 Update utils.js 2019-08-07 16:35:29 +01:00
Official Noob
baba619fe7 Fixed scope 2019-08-07 16:20:07 +01:00
Official Noob
dce036b0e6 Update utils.js 2019-08-07 15:46:07 +01:00
Official Noob
c6c8d7de49 Update utils.js 2019-08-07 15:34:21 +01:00
Official Noob
02e11503cb Removed Regex as "looks bad" 2019-08-06 22:06:23 +01:00
Official Noob
d75a7ca897 Added youtube-nocookie.com 2019-08-06 21:40:23 +01:00
Official Noob
2b5402fa57 Added sanity check 2019-08-06 14:08:46 +01:00
Official Noob
7ad5e426fb Improved Parser 2019-08-06 10:27:13 +01:00
Official Noob
bbbb4f4877 Made UUID less predictable 2019-08-04 20:01:39 +01:00
Official Noob
9a32710ef8 Removed getYouTubeVideoStartTime 2019-08-04 19:09:46 +01:00
Official Noob
d25792f39a Removed getYouTubeVideoID 2019-08-04 19:07:00 +01:00
Official Noob
5ee279dec7 Added getYouTubeVideoStartTime 2019-08-04 19:06:07 +01:00
Official Noob
e6fa832cb8 Removed getYouTubeVideoID as in utils 2019-08-04 19:04:43 +01:00
Official Noob
64befaebfc Removed getYouTubeVideoID as in utils 2019-08-04 19:00:54 +01:00
Official Noob
5425c54fca Added utils.js 2019-08-04 18:59:51 +01:00
Official Noob
aae0998426 Added utils.js 2019-08-04 18:59:08 +01:00
Official Noob
f6c9e8e235 Added getYouTubeVideoID 2019-08-04 18:47:07 +01:00
Ajay Ramachandran
18909ffef6 Merge pull request #71 from marioortizmanero/master
Grammar and phrasing fixes
2019-08-04 09:17:10 -04:00
Mario Ortiz Manero
3a037818a8 Grammar and phrasing fixes 2019-08-04 13:29:43 +02:00
Ajay Ramachandran
101d94f46e Merge pull request #70 from ajayyy/experimental
Made popup close on video change
2019-08-03 23:32:07 -04:00
Ajay Ramachandran
38bb50a472 Made popup close on video change 2019-08-03 23:30:45 -04:00
Ajay Ramachandran
3b3653af67 Update README.md 2019-08-03 22:38:21 -04:00
Ajay Ramachandran
6be7408d80 Merge pull request #68 from ajayyy/experimental
Channel whitelisting, more support and bug fixes
2019-08-03 22:17:29 -04:00
Ajay Ramachandran
6d67559627 Update version number. 2019-08-03 22:14:08 -04:00
Ajay Ramachandran
db46d0438f Added whitelist support to the old YouTube theme. 2019-08-03 22:12:20 -04:00
Ajay Ramachandran
a5580daebd Added channel whitelisting.
Known issue: Does not work with 0 second sponsors.

Resolves https://github.com/ajayyy/SponsorBlock/issues/38
2019-08-03 21:35:41 -04:00
Ajay Ramachandran
809be3b2fb Fixed submit button disappearing after already submitting once. 2019-08-03 20:52:09 -04:00
Ajay Ramachandran
0319c507d3 Made videos load from the subscription page. 2019-08-03 14:11:47 -04:00
Ajay Ramachandran
8ffab867e1 Made zero second skips not skip when the video starts at a non zero time. 2019-08-02 22:37:12 -04:00
Ajay Ramachandran
fcf7141733 Update version number 2019-08-02 22:14:35 -04:00
Ajay Ramachandran
1c1fb6006c Added support for loading a channel page first.
Still has some issues on slow PCs, see https://github.com/ajayyy/SponsorBlock/issues/60
2019-08-02 12:18:56 -04:00
Ajay Ramachandran
6cb07b5be3 Fixed the preview sometimes not updating 2019-08-02 00:54:50 -04:00
Ajay Ramachandran
9342112bac Merge pull request #59 from ajayyy/experimental
Moved notice, embed support and bug fixes
2019-08-01 21:42:52 -04:00
Ajay Ramachandran
3d1be7158d Added support for embedded videos.
Resolved https://github.com/ajayyy/SponsorBlock/issues/12
2019-08-01 20:55:47 -04:00
Ajay Ramachandran
efe512b561 Removed unnecessary check for if the info tab is loaded 2019-08-01 20:38:36 -04:00
Ajay Ramachandran
d738eac42d Moved notice to a better location and shrunk it. 2019-08-01 20:32:04 -04:00
Ajay Ramachandran
a83969e3eb Fixed notice never displaying 2019-08-01 20:21:45 -04:00
Ajay Ramachandran
92cb8fb65c Updated version number 2019-08-01 20:02:42 -04:00
Ajay Ramachandran
932702cca1 Added preview before uploading submissions. 2019-08-01 20:01:33 -04:00
Ajay Ramachandran
ca8404147d Made clicking upload hide the clear button 2019-08-01 15:19:58 -04:00
Ajay Ramachandran
35c3b5b97f Made it only count a contribution if it was uploaded successfully. 2019-07-31 23:47:04 -04:00
Ajay Ramachandran
015b283731 Merge pull request #50 from OfficialNoob/patch-7
Added ErrorParser
2019-07-31 23:24:28 -04:00
Ajay Ramachandran
2667838937 Merge branch 'experimental' of https://github.com/ajayyy/SponsorBlock into patch-7
# Conflicts:
#	popup.js
2019-07-31 23:22:43 -04:00
Ajay Ramachandran
a5ec7b2466 Fixed missing comma 2019-07-31 23:21:30 -04:00
Ajay Ramachandran
3a0a267e12 Reimplements error system 2019-07-31 23:17:40 -04:00
Ajay Ramachandran
cbdb715fac Merge pull request #51 from OfficialNoob/patch-8
"Improvements" to the Ref system
2019-07-31 23:11:26 -04:00
Ajay Ramachandran
64fb12289c Merge branch 'experimental' into patch-8 2019-07-31 23:11:18 -04:00
Ajay Ramachandran
25801b6fcd Merged into master 2019-07-31 23:09:33 -04:00
Ajay Ramachandran
1341d5e11d Fixed grammer 2019-07-31 22:57:50 -04:00
Official Noob
e1dc5fbdf5 t => T 2019-07-31 12:53:25 +01:00
Ajay Ramachandran
83b4bbc95a Merge pull request #56 from ajayyy/experimental
Added help page on install
2019-07-31 00:14:04 -04:00
Ajay Ramachandran
585be8adf4 Added help page on install. 2019-07-31 00:12:02 -04:00
Ajay Ramachandran
9462886539 Merge pull request #55 from ajayyy/experimental
Fixed save button being in the wrong place and made submit button hidden on editing
2019-07-30 21:08:58 -04:00
Ajay Ramachandran
85518d8130 Fixed save button being in the wrong place and made submit button hide on editing. 2019-07-30 21:07:27 -04:00
Ajay Ramachandran
e3aeb0caa1 Update LICENSE 2019-07-30 18:38:07 -04:00
Ajay Ramachandran
7ed72fad40 Merge pull request #52 from ajayyy/experimental
Firefox fixes
2019-07-30 18:22:45 -04:00
Ajay Ramachandran
a2b4f8d141 Update version number 2019-07-30 18:21:23 -04:00
Ajay Ramachandran
6ad1070c44 Merge branch 'master' into experimental 2019-07-30 18:20:27 -04:00
Ajay Ramachandran
b1784fa311 Update version number. 2019-07-30 18:18:03 -04:00
Ajay Ramachandran
74affbd9c0 Fixed Firefox notification issue 2019-07-30 18:15:49 -04:00
Ajay Ramachandran
10d1978566 Added better support for the old YouTube layout. 2019-07-30 15:57:28 -04:00
Official Noob
d51e8044f4 Update popup.js 2019-07-30 20:46:02 +01:00
Official Noob
69dee25ea8 "Improvements" to the Ref system 2019-07-30 20:43:45 +01:00
Official Noob
0d8c18a38a Update popup.js 2019-07-30 19:44:45 +01:00
Ajay Ramachandran
a1c8ecabca Merge pull request #49 from OfficialNoob/patch-6
Old function in-use
2019-07-30 14:41:21 -04:00
Official Noob
a4eb37db18 Added ErrorParser 2019-07-30 19:41:06 +01:00
Official Noob
53f611a43a Old function in-use 2019-07-30 18:59:06 +01:00
Ajay Ramachandran
b0929e2431 Remade the popup menu to support Firefox and not use IFrames. 2019-07-30 13:27:20 -04:00
Ajay Ramachandran
da20709512 Merge pull request #48 from ajayyy/experimental
More options
2019-07-30 00:11:45 -04:00
Ajay Ramachandran
6ff461fa86 Updated version number 2019-07-30 00:09:11 -04:00
Ajay Ramachandran
e205447968 Added ability to hide info and delete button. 2019-07-29 21:40:13 -04:00
Ajay Ramachandran
ff6234bffe Increased font size of sponsor time, edit and delete buttons.
Also made clicking times trigger an edit.
2019-07-29 21:19:29 -04:00
Ajay Ramachandran
d93d475c1f Added error messages to video player submission. 2019-07-29 21:09:10 -04:00
Ajay Ramachandran
0d0b919106 Added better error messages to voting. 2019-07-29 21:06:15 -04:00
Ajay Ramachandran
366fd43752 Added more specific error message for error 502 2019-07-29 20:58:48 -04:00
Ajay Ramachandran
1119adffb7 Added clear button. 2019-07-29 20:54:10 -04:00
Ajay Ramachandran
9d14f02bec Update README.md 2019-07-29 17:54:21 -04:00
Ajay Ramachandran
9fada00028 Update LICENSE 2019-07-29 17:53:15 -04:00
Ajay Ramachandran
e0d2436372 Added support for old youtube theme 2019-07-29 16:35:30 -04:00
Ajay Ramachandran
e4c94aa5c5 Added more info the confirmation button. 2019-07-29 16:29:20 -04:00
Ajay Ramachandran
e3e4121a21 Merge pull request #46 from ajayyy/experimental
Improved video controls
2019-07-29 16:25:39 -04:00
Ajay Ramachandran
a75ea50098 Update version number. 2019-07-29 15:42:48 -04:00
Ajay Ramachandran
6b6e74b5a0 Added popup as an info menu that is opened on the side. 2019-07-29 15:42:14 -04:00
Ajay Ramachandran
d6c5dbaff1 Made deleting an unfinished sponsor time properly update buttons. 2019-07-29 14:22:46 -04:00
Ajay Ramachandran
a66804064a Made edit button not work when end time not specified 2019-07-29 14:20:55 -04:00
Ajay Ramachandran
919f9f56bd Added sponsor time editing in the popup. 2019-07-29 14:18:10 -04:00
Ajay Ramachandran
bd614e250b Added ability to delete individual sponsor times 2019-07-29 13:09:23 -04:00
Ajay Ramachandran
6275c2d62c Added info about popup. 2019-07-29 11:41:43 -04:00
Ajay Ramachandran
feea7aa51d Added what the sponsor times being submitted are to the confirmation message. 2019-07-29 11:36:57 -04:00
Ajay Ramachandran
16263d463f Updated extension name 2019-07-29 11:12:02 -04:00
Ajay Ramachandran
6673272e14 Update README.md 2019-07-29 11:08:19 -04:00
Ajay Ramachandran
6358ba2e11 Merge pull request #44 from ajayyy/experimental
Added discord link to popup
2019-07-28 23:53:39 -04:00
Ajay Ramachandran
2415784eee Added discord link to popup. 2019-07-28 23:52:32 -04:00
Ajay Ramachandran
acb3c67629 Merge pull request #43 from ajayyy/experimental
Updates to the video player controls
2019-07-28 20:53:38 -04:00
Ajay Ramachandran
622b2ea158 Updated version number. 2019-07-28 20:51:09 -04:00
Ajay Ramachandran
7a9af6cbcf Alt-text now updates with state on player button 2019-07-28 18:51:46 -04:00
Ajay Ramachandran
51a389284d Made video player controls state properly update when the video changes. 2019-07-28 18:48:28 -04:00
Ajay Ramachandran
2ff70f1511 Added missing references. 2019-07-28 18:32:53 -04:00
Ajay Ramachandran
ff9badf2e9 Merge pull request #39 from ajayyy/experimental
Fixed an issue on Firefox where the old video's sponsors would sometimes play on the next video
2019-07-28 17:56:50 -04:00
Ajay Ramachandran
aefc880486 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into experimental
# Conflicts:
#	content.js
#	firefox_manifest.json
#	manifest.json
2019-07-28 17:24:25 -04:00
Ajay Ramachandran
e749456719 Updated version number. 2019-07-28 17:23:01 -04:00
Ajay Ramachandran
a2312a10be Fixed an issue on Firefox where the old video's sponsors would sometimes play on the next video. 2019-07-28 17:22:05 -04:00
Ajay Ramachandran
b0090a3334 Merge pull request #37 from OfficialNoob/patch-5
getYouTubeVideoID Better ID Parser
2019-07-27 17:30:01 -04:00
Official Noob
7100831956 getYouTubeVideoID Video ID Parser 2019-07-27 22:18:43 +01:00
Ajay Ramachandran
30c1b2d919 Added reference and updated version number. 2019-07-27 11:18:50 -04:00
Ajay Ramachandran
3ec6caee9d Merge pull request #32 from OfficialNoob/patch-3
Added references
2019-07-27 11:13:21 -04:00
Ajay Ramachandran
7f505a52ca Merge pull request #30 from OfficialNoob/patch-1
Added confirm for submitSponsorTimes
2019-07-27 11:12:36 -04:00
Ajay Ramachandran
84b8e59b39 Merge branch 'master' into patch-1 2019-07-27 11:12:27 -04:00
Ajay Ramachandran
808dfe42ce Merge pull request #35 from ajayyy/experimental
Made it not possible to submit from the hotkey when not ready
2019-07-27 11:10:23 -04:00
Ajay Ramachandran
600365d998 Made it not possible to submit from the hotkey when not ready. 2019-07-27 11:08:29 -04:00
Official Noob
569699cbc1 Added references 2019-07-27 13:57:04 +01:00
Official Noob
08cb324125 Added confirm for submitSponsorTimes 2019-07-27 12:57:44 +01:00
Ajay Ramachandran
504f0b0ede Merge pull request #29 from ajayyy/experimental
Removed logging
2019-07-26 22:43:25 -04:00
Ajay Ramachandran
00877fb087 Removed logging. 2019-07-26 22:43:09 -04:00
Ajay Ramachandran
d654d8934b Merge pull request #26 from ajayyy/experimental
Fixed bug making player controls only submit integers
2019-07-26 21:47:56 -04:00
Ajay Ramachandran
97e202dbd0 Fixed bug making player controls only submit integers. 2019-07-26 21:44:39 -04:00
Ajay Ramachandran
64be41b008 Merge pull request #25 from ajayyy/experimental
Fixed old unsponsored times sometimes being used
2019-07-26 20:26:29 -04:00
Ajay Ramachandran
b3684a8730 Added hint about the hotkey. 2019-07-26 20:23:13 -04:00
Ajay Ramachandran
45f0d65f69 Fixed old unsponsored times sometimes being used. 2019-07-26 20:19:51 -04:00
Ajay Ramachandran
5436a1651e Merge pull request #9 from ajayyy/experimental
Added support for hotkeys to submit data
2019-07-26 16:24:11 -04:00
Ajay Ramachandran
33fe63084b Added support for hotkeys to submit data. 2019-07-26 16:20:07 -04:00
Ajay Ramachandran
8f47513c98 Merge pull request #8 from ajayyy/experimental
Added quick fix for changing UUID when submitting two times
2019-07-26 14:21:50 -04:00
Ajay Ramachandran
7a17cc2b0a Updated version number. 2019-07-26 14:19:21 -04:00
Ajay Ramachandran
c7cb845d8a Added quick fix for changing UUID when submitting two times. 2019-07-26 14:19:01 -04:00
Ajay Ramachandran
250c75a78f Merge pull request #7 from ajayyy/experimental
Zero second sponsors and support for switching tabs
2019-07-25 20:07:52 -04:00
Ajay Ramachandran
a86e55ac67 Update version number. 2019-07-25 20:07:08 -04:00
Ajay Ramachandran
30f2f638fe Added support for sponsors at the zero second mark.
Also fixed some issues on the old YouTube theme.
2019-07-25 20:00:07 -04:00
Ajay Ramachandran
725ab783e3 Made it work when multiple tabs are opened in the background.
Now uses the focused tab instead of last tab updated.
2019-07-25 18:25:50 -04:00
Ajay Ramachandran
30e3222177 Updated version number 2019-07-25 17:00:02 -04:00
Ajay Ramachandran
d9789c20d6 Merge pull request #6 from ajayyy/experimental
Added better error display
2019-07-25 16:59:05 -04:00
Ajay Ramachandran
c8114e2d7e Added better error display. 2019-07-25 16:55:07 -04:00
Ajay Ramachandran
c7da0f0c65 Merge pull request #5 from ajayyy/experimental
Added option to disable view count tracking
2019-07-23 21:09:36 -04:00
Ajay Ramachandran
0f561d4a5a Added option to disable the view count tracking. 2019-07-23 21:06:36 -04:00
Ajay Ramachandran
55c7529731 Update README.md 2019-07-23 20:06:08 -04:00
24 changed files with 4258 additions and 1448 deletions

View File

@@ -1,4 +1,8 @@
GNU GENERAL PUBLIC LICENSE
SponsorBlock Copyright (C) 2019 Ajay Ramachandran and other SponsorBlock contributors.
Please refer to the license below.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
@@ -651,8 +655,9 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

View File

@@ -1,9 +1,21 @@
![Logo](icons/LogoSponsorBlocker256px.png)
<br/><sub>Logo by [@munadikieh](https://github.com/munadikieh)</sub>
<p align="center">
<img src="icons/LogoSponsorBlocker256px.png" alt="Logo"></img>
<br/>
<sub>Logo by <a href="https://github.com/munadikieh">@munadikieh</a></sub>
</p>
# SponsorBlock
<h1 align="center">SponsorBlock</h1>
SponsorBlock is an extension that will skip over sponsored segments of YouTube videos. SponsorBlock is a crowdsourced browser extension that let's anyone submit the start and end time's of sponsored segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment.
<p align="center">
<a href="https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone">Chrome/Chromium</a> |
<a href="https://addons.mozilla.org/addon/sponsorblock/?src=external-github">Firefox</a> |
<a href="https://sponsor.ajay.app">Website</a> |
<a href="https://sponsor.ajay.app/stats">Stats</a>
</p>
SponsorBlock is an extension that will skip over sponsored segments of YouTube videos. SponsorBlock is a crowdsourced browser extension that lets anyone submit the start and end times of sponsored segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment.
# Server
@@ -15,20 +27,18 @@ To make sure that this project doesn't die, I have made the database publicly do
Hopefully this project can be combined with projects like [this](https://github.com/Sponsoff/sponsorship_remover) and use this data to create a neural network to predict when sponsored segments happen. That project is sadly abandoned now, so I have decided to attempt to revive this idea.
# Previous extension
# API
This project is partially based off of [this experimental extension](https://github.com/OfficialNoob/YTSponsorSkip). That extension has the basic video skipping functionality.
You can read the API docs [here](https://github.com/ajayyy/SponsorBlockServer#api-docs).
# Chrome extension
# Build Yourself
It will be on the chrome webstore soon once I get some more UI features in, such as an icon. For now, you can load this project as an unpacked extension. Make sure to rename the `config.js.example` file to `config.js` before installing.
# Firefox extension
None at the moment
You can load this project as an unpacked extension. Make sure to rename the `config.js.example` file to `config.js` before installing.
# Credit
The awesome [Invidious API](https://github.com/omarroth/invidious/wiki/API) is used to grab the time the video was published.
Some icons made by <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a>
Some icons made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a>

139
_locales/en/messages.json Normal file
View File

@@ -0,0 +1,139 @@
{
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": {
"message": "SponsorBlock for YouTube - Skip Sponsorships",
"description": "Name of the extension."
},
"Description": {
"message": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.",
"description": "Description of the extension."
},
"helpPage": {
"message": "index_en.html"
},
"400": {
"message": "Server said this request was invalid"
},
"429": {
"message": "You have submitted too many sponsor times for this one video, are you sure there are this many?"
},
"409": {
"message": "This has already been submitted before"
},
"502": {
"message": "It seems the server is down. Contact the dev to inform them."
},
"channelWhitelisted": {
"message": "Channel Whitelisted!"
},
"Sponsor": {
"message": "Sponsor"
},
"Sponsors": {
"message": "Sponsors"
},
"Segment": {
"message": "sponsor segment"
},
"Segments": {
"message": "sponsor segments"
},
"noticeTitle": {
"message": "Sponsor Skipped"
},
"reportButtonTitle": {
"message": "Report"
},
"reportButtonInfo": {
"message": "Report this sponsor submission as incorrect."
},
"Dismiss": {
"message": "Dismiss"
},
"Loading": {
"message": "Loading..."
},
"Mins": {
"message": "Minutes"
},
"Secs": {
"message": "Seconds"
},
"Hide": {
"message": "Never Show"
},
"hitGoBack": {
"message": "Hit unskip to get to where you came from."
},
"unskip": {
"message": "Unskip"
},
"reskip": {
"message": "Reskip"
},
"paused": {
"message": "Paused"
},
"confirmMSG": {
"message": "\n\nTo edit or delete individual values, click the info button or open the extension popup by clicking the extension icon in the top right corner."
},
"clearThis": {
"message": "Are you sure you want to clear this?\n\n"
},
"Unknown": {
"message": "There was an error submitting your sponsor times, please try again later."
},
"sponsorFound": {
"message": "This video's sponsors are in the database!"
},
"sponsor404": {
"message": "No sponsors found"
},
"sponsorStart": {
"message": "Sponsorship Starts Now"
},
"sponsorEnd": {
"message": "Sponsorship Ends Now"
},
"noVideoID": {
"message": "This probably isn't a YouTube tab, or you clicked too early. \n If you know this is a YouTube tab,\n close this popup and open it again."
},
"success": {
"message": "Success!"
},
"voted": {
"message": "Voted!"
},
"voteFail": {
"message": "You have already voted this way before."
},
"serverDown": {
"message": "It seems the sever is down. Contact the dev immediately."
},
"connectionError": {
"message": "A connection error has occured. Error code: "
},
"wantToSubmit": {
"message": "Do you want to submit the sponsor times for video id"
},
"leftTimes": {
"message": "You seem to have left some sponsor times unsubmitted. Go back to that page to submit them (they are not deleted)."
},
"clearTimes": {
"message": "Clear Sponsor Times"
},
"openPopup": {
"message": "Open SponsorBlock Popup"
},
"SubmitTimes": {
"message": "Submit Sponsor Times"
},
"submitCheck": {
"message": "Are you sure you want to submit this?"
}
}

129
_locales/fr/messages.json Normal file
View File

@@ -0,0 +1,129 @@
{
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": {
"message": "SponsorBlock pour YouTube - Enlève les messages commerciaux et publicités intégrées",
"description": "Name of the extension."
},
"Description": {
"message": "Passe automatiquement les messages commerciaux intégrés dans les vidéos YouTube. Soumettez les segments commerciaux dans les vidéos que vous regardez pour aidez les autres.",
"description": "Description of the extension."
},
"helpPage": {
"message": "index_en.html"
},
"400": {
"message": "Soumission invalide"
},
"429": {
"message": "Vous cherchez à envoyer beaucoup de segments, il y en a vraiment autant ?"
},
"409": {
"message": "Déja soumis"
},
"502": {
"message": "Le serveur ne fonctionne pas. Contactez le développeur."
},
"channelWhitelisted": {
"message": "Cette chaine est sur la liste blanche !"
},
"Sponsor": {
"message": "message commercial"
},
"Sponsors": {
"message": "messages commerciaux"
},
"Segment": {
"message": "segment de message commercial"
},
"Segments": {
"message": "segments de message commercial"
},
"noticeTitle": {
"message": "Message passé"
},
"reportButtonTitle": {
"message": "Incorrect"
},
"reportButtonInfo": {
"message": "Signaler que ce segment est incorrect ou n'existe pas."
},
"Dismiss": {
"message": "Fermer"
},
"Loading": {
"message": "Chargement en cours..."
},
"Mins": {
"message": "Minutes"
},
"Secs": {
"message": "Secondes"
},
"Hide": {
"message": "Ne plus montrer"
},
"hitGoBack": {
"message": "Cliquez sur revenir en arrière pour revenir avant le saut du segment"
},
"unskip": {
"message": "Revenir en arrière"
},
"reskip": {
"message": "Sauter"
},
"paused": {
"message": "En pause"
},
"confirmMSG": {
"message": "\n\nPour modifier ou enlever des soumissions, cliquez sur le bouton d'info."
},
"clearThis": {
"message": "Êtes-vous certain(e) que vous voulez enlever vos soumissions ?\n\n"
},
"Unknown": {
"message": "Erreur, essayer plus tard."
},
"sponsorFound": {
"message": "Les messages commerciaux sont déjà dans notre base de donnée pour cette vidéo !"
},
"sponsor404": {
"message": "Pas de messages trouvés"
},
"sponsorStart": {
"message": "Début du message"
},
"sponsorEnd": {
"message": "Fin du message"
},
"noVideoID": {
"message": "Ceci n'est pas un onglet YouTube, ou vous avez cliqué trop tôt. \n Si vous êtes sur(e) que c'est un onglet YouTube, fermez ce menu et réessayer."
},
"success": {
"message": "Succès !"
},
"voted": {
"message": "A voté !"
},
"voteFail": {
"message": "Vous avez déjà voté pour ce choix auparavant."
},
"serverDown": {
"message": "Le serveur ne fonctionne pas. Contactez le développeur."
},
"connectionError": {
"message": "Erreur de connexion, Code : "
},
"wantToSubmit": {
"message": "Voulez-vous soumettre les messages pour cette vidéo"
},
"leftTimes": {
"message": "Vous avez laissé des messages non soumis. Retournez sur la vidéo pour les soumettre (ils ont été conservés)."
},
"submitCheck": {
"message": "Soumettre ce(s) message(s) ?"
}
}

View File

@@ -0,0 +1,127 @@
{
"Name": {
"message": "SponsorBlock",
"description": "Nome da extensão."
},
"fullName": {
"message": "SponsorBlock para YouTube - Pule patrocínios",
"description": "Nome da extensão."
},
"Description": {
"message": "Pule patrocinadores em vídeos do YouTube. Reporte patrocinadores em videos que você assiste para salvar o tempo dos outros.",
"description": "Descrição da extensão."
},
"helpPage": {
"message": "index_en.html"
},
"400": {
"message": "O servidor disse que esse pedido foi inválido"
},
"429": {
"message": "Você enviou muitos segmentos para esse vídeo, tem certeza que tem tantos assim?"
},
"409": {
"message": "Isso já foi enviado antes"
},
"502": {
"message": "Parece que o servidor caiu. Contate o desenvolvedor para informá-los."
},
"channelWhitelisted": {
"message": "Canal adicionado a lista branca!"
},
"Sponsor": {
"message": "patrocinador"
},
"Sponsors": {
"message": "patrocinadores"
},
"Segment": {
"message": "segmento de patrocinador"
},
"Segments": {
"message": "segmento de patrocinadores"
},
"noticeTitle": {
"message": "Patrocinador pulado"
},
"reportButtonTitle": {
"message": "Reportar"
},
"reportButtonInfo": {
"message": "Reportar essa subimissão como inválida."
},
"Dismiss": {
"message": "Ignorar"
},
"Loading": {
"message": "Carregando..."
},
"Mins": {
"message": "Minutos"
},
"Secs": {
"message": "Segundos"
},
"Hide": {
"message": "Nunca mostrar"
},
"hitGoBack": {
"message": "Aperta reverter pulo para voltar onde estava"
},
"unskip": {
"message": "Reverter pulo"
},
"reskip": {
"message": "Pular novamente"
},
"paused": {
"message": "Pausado"
},
"confirmMSG": {
"message": "\n\nPara editar ou remover linhas individuais, clique com o botão direito ou abra o popup da extensão pelo icone no canto superior direito."
},
"clearThis": {
"message": "Tem certeza que quer limpar isso?\n\n"
},
"Unknown": {
"message": "Teve um erro ao enviar seus segmentos, tente novamente depois"
},
"sponsorFound": {
"message": "Os patrocinadores desse vídeo estão no banco de dados!"
},
"sponsor404": {
"message": "Nenhum patrocinador encontrado"
},
"sponsorStart": {
"message": "Patrocínio começa agora"
},
"sponsorEnd": {
"message": "Patrocínio termina agora"
},
"noVideoID": {
"message": "Isso provavelmente não é uma tab do YouTube, ou você clicou muito cedo. \n Se sabe que é uma tab do YouTube,\n fecha esse popup e abre de novo."
},
"success": {
"message": "Sucesso!"
},
"voted": {
"message": "Votado!"
},
"voteFail": {
"message": "Você já votou antes."
},
"serverDown": {
"message": "Parece que o servidor caiu. Contate o desenvolvedor o quanto antes."
},
"connectionError": {
"message": "Um erro de conexão aconteceu: Código: "
},
"wantToSubmit": {
"message": "Quer enviar os segmentos para o vídeo de ID"
},
"leftTimes": {
"message": "Parece que você esqueceu de enviar alguns segmentos. Volta pra página para enviar eles (não foram deletados)."
}
}

130
_locales/ru/messages.json Normal file
View File

@@ -0,0 +1,130 @@
{
"Name": {
"message": "SponsorBlock",
"description": "Название расширения, не переводится."
},
"fullName": {
"message": "SponsorBlock для YouTube - Пропускайте спонсорские вставки",
"description": "Название расширения."
},
"Description": {
"message": "Пропускайте спонсорские вставки в видео на YouTube. Сообщайте о спонсорских вставках в видео, которые Вы смотрите, чтобы сэкономить время других пользователей.",
"description": "Описание раширения."
},
"helpPage": {
"message": "index_en.html"
},
"400": {
"message": "Сервер отклонил этот запрос."
},
"429": {
"message": "Вы отправили слишком много спонсоров для этого видео. Вы уверены, что их так много?"
},
"409": {
"message": "Этот запрос был отправлен ранее."
},
"502": {
"message": "Сервер недоступен. Свяжитесь с разработчиком и сообщите ему об этом."
},
"channelWhitelisted": {
"message": "Канал добавлен в белый список!"
},
"Sponsor": {
"message": "Спонсор"
},
"Sponsors": {
"message": "Спонсоры"
},
"Segment": {
"message": "спонсорская вставка"
},
"Segments": {
"message": "спонсорские вставки"
},
"noticeTitle": {
"message": "Спонсор пропущен"
},
"reportButtonTitle": {
"message": "Ошибка"
},
"reportButtonInfo": {
"message": "Сообщить, что информация об этом спонсорском сегменте ошибочна."
},
"Dismiss": {
"message": "Закрыть"
},
"Loading": {
"message": "Загрузка..."
},
"Mins": {
"message": "мин"
},
"Secs": {
"message": "сек"
},
"Hide": {
"message": "Не показывать"
},
"hitGoBack": {
"message": "Нажмите «Назад», чтобы вернуться обратно."
},
"unskip": {
"message": "Назад"
},
"reskip": {
"message": "Пропустить"
},
"paused": {
"message": "Пауза"
},
"confirmMSG": {
"message": "\n\nЧтобы изменить или удалить отдельные значения, нажмите кнопку «Информация» или откройте всплывающее окно расширения, щелкнув значок расширения в правом верхнем углу."
},
"clearThis": {
"message": "Вы уверены, что хотите удалить эту информацию?\n\n"
},
"Unknown": {
"message": "При отправке отчета о спонсорском сегменте произошла ошибка. Попытайтесь отправить его позже."
},
"sponsorFound": {
"message": "Спонсоры этого видео уже находятся в базе данных!"
},
"sponsor404": {
"message": "Спонсорские вставки не найдены"
},
"sponsorStart": {
"message": "Спонсорская вставка начинается сейчас"
},
"sponsorEnd": {
"message": "Спонсорская вставка оканчивается сейчас"
},
"noVideoID": {
"message": "Возможно, это не вкладка YouTube, или Вы нажали слишком рано. \n Если это вкладка YouTube,\n закройте это всплывающее окно и откройте его снова."
},
"success": {
"message": "Успех!"
},
"voted": {
"message": "Голос засчитан!"
},
"voteFail": {
"message": "Вы уже проголосовали таким образом раньше."
},
"serverDown": {
"message": "Кажется, сервер не работает. Свяжитесь с разработчиком."
},
"connectionError": {
"message": "Ошибка соединения. Код ошибки: "
},
"wantToSubmit": {
"message": "Вы точно хотите отправить отчёт о спонсорских вставках в видео с идентификатором"
},
"leftTimes": {
"message": "Вы ещё не отправили отчёты о некоторых спонсорских вставках. Хотите вернуться на эту страницу, чтобы отправить их (они не удаляются)."
},
"submitCheck": {
"message": "Вы уверены, что хотите отправить эту информацию?"
}
}

View File

@@ -1,226 +1,242 @@
var previousVideoID = null
//the id of this user, randomly generated once per install
var userID = null;
chrome.tabs.onUpdated.addListener( // On tab update
function(tabId, changeInfo, tab) {
if (changeInfo != undefined && changeInfo.url != undefined) {
let id = getYouTubeVideoID(changeInfo.url);
if (changeInfo.url && id) { // If URL changed and is youtube video message contentScript the video id
videoIDChange(id);
chrome.tabs.sendMessage( tabId, {
message: 'ytvideoid',
id: id
});
}
}
}
);
chrome.runtime.onMessage.addListener(function (request, sender, callback) {
if (request.message == "submitTimes") {
submitTimes(request.videoID, callback);
//this allows the callback to be called later by the submitTimes function
return true;
} else if (request.message == "ytvideoid") {
if (previousVideoID != request.videoID) {
videoIDChange(request.videoID);
}
} else if (request.message == "addSponsorTime") {
addSponsorTime(request.time);
} else if (request.message == "getSponsorTimes") {
getSponsorTimes(request.videoID, function(sponsorTimes) {
callback({
sponsorTimes: sponsorTimes
})
});
//this allows the callback to be called later
return true;
} else if (request.message == "submitVote") {
submitVote(request.type, request.UUID, callback);
//this allows the callback to be called later
return true;
}
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.sendMessage(tabId, {
message: 'update',
});
});
chrome.runtime.onMessage.addListener(function (request, sender, callback) {
switch(request.message) {
case "submitTimes":
submitTimes(request.videoID, callback);
//this allows the callback to be called later by the submitTimes function
return true;
case "addSponsorTime":
addSponsorTime(request.time, request.videoID, callback);
//this allows the callback to be called later
return true;
case "getSponsorTimes":
getSponsorTimes(request.videoID, function(sponsorTimes) {
callback({
sponsorTimes: sponsorTimes
})
});
//this allows the callback to be called later
return true;
case "submitVote":
submitVote(request.type, request.UUID, callback);
//this allows the callback to be called later
return true;
case "alertPrevious":
chrome.notifications.create("stillThere" + Math.random(), {
type: "basic",
title: chrome.i18n.getMessage("wantToSubmit") + request.previousVideoID + "?",
message: chrome.i18n.getMessage("leftTimes"),
iconUrl: "./icons/LogoSponsorBlocker256px.png"
});
}
});
//add help page on install
chrome.runtime.onInstalled.addListener(function (object) {
// TODO (shownInstallPage): remove shownInstallPage logic after sufficient amount of time,
// so that people have time to upgrade and move to shownInstallPage-free code.
chrome.storage.sync.get(["userID", "shownInstallPage"], function(result) {
const userID = result.userID;
// TODO (shownInstallPage): delete row below
const shownInstallPage = result.shownInstallPage;
// If there is no userID, then it is the first install.
if (!userID){
// Show install page, if there is no user id
// and there is no shownInstallPage.
// TODO (shownInstallPage): remove this if statement, but leave contents
if (!shownInstallPage){
//open up the install page
chrome.tabs.create({url: chrome.extension.getURL("/help/"+chrome.i18n.getMessage("helpPage"))});
}
// TODO (shownInstallPage): delete if statement and contents
// If shownInstallPage is set, remove it.
if (!!shownInstallPage){
chrome.storage.sync.remove("shownInstallPage");
}
//generate a userID
const newUserID = generateUserID();
//save this UUID
chrome.storage.sync.set({
"userID": newUserID
});
}
});
});
//gets the sponsor times from memory
function getSponsorTimes(videoID, callback) {
let sponsorTimes = [];
let sponsorTimeKey = "sponsorTimes" + videoID;
chrome.storage.sync.get([sponsorTimeKey], function(result) {
let sponsorTimesStorage = result[sponsorTimeKey];
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
sponsorTimes = sponsorTimesStorage;
}
let sponsorTimes = [];
let sponsorTimeKey = "sponsorTimes" + videoID;
chrome.storage.sync.get([sponsorTimeKey], function(result) {
let sponsorTimesStorage = result[sponsorTimeKey];
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
sponsorTimes = sponsorTimesStorage;
}
callback(sponsorTimes)
});
callback(sponsorTimes)
});
}
function addSponsorTime(time) {
getSponsorTimes(previousVideoID, function(sponsorTimes) {
//add to sponsorTimes
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length < 2) {
//it is an end time
sponsorTimes[sponsorTimes.length - 1][1] = parseInt(time);
} else {
//it is a start time
let sponsorTimesIndex = sponsorTimes.length;
sponsorTimes[sponsorTimesIndex] = [];
function addSponsorTime(time, videoID, callback) {
getSponsorTimes(videoID, function(sponsorTimes) {
//add to sponsorTimes
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length < 2) {
//it is an end time
sponsorTimes[sponsorTimes.length - 1][1] = time;
} else {
//it is a start time
let sponsorTimesIndex = sponsorTimes.length;
sponsorTimes[sponsorTimesIndex] = [];
sponsorTimes[sponsorTimesIndex][0] = parseInt(time);
}
sponsorTimes[sponsorTimesIndex][0] = time;
}
//save this info
let sponsorTimeKey = "sponsorTimes" + previousVideoID;
chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes});
});
//save this info
let sponsorTimeKey = "sponsorTimes" + videoID;
chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}, callback);
});
}
function submitVote(type, UUID, callback) {
getUserID(function(userID) {
//publish this vote
sendRequestToServer('GET', "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + "&type=" + type, function(xmlhttp, error) {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
callback({
successType: 1
});
} else if (xmlhttp.readyState == 4 && xmlhttp.status == 405) {
//duplicate vote
callback({
successType: 0
});
} else if (error) {
//error while connect
callback({
successType: -1
});
}
chrome.storage.sync.get(["userID"], function(result) {
let userID = result.userID;
if (userID == undefined || userID === "undefined") {
//generate one
userID = generateUserID();
chrome.storage.sync.set({
"userID": userID
});
}
//publish this vote
sendRequestToServer("GET", "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + "&type=" + type, function(xmlhttp, error) {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
callback({
successType: 1
});
} else if (xmlhttp.readyState == 4 && xmlhttp.status == 405) {
//duplicate vote
callback({
successType: 0,
statusCode: xmlhttp.status
});
} else if (error) {
//error while connect
callback({
successType: -1,
statusCode: xmlhttp.status
});
}
})
})
})
}
function submitTimes(videoID, callback) {
//get the video times from storage
let sponsorTimeKey = 'sponsorTimes' + videoID;
chrome.storage.sync.get([sponsorTimeKey], function(result) {
let sponsorTimes = result[sponsorTimeKey];
//get the video times from storage
let sponsorTimeKey = 'sponsorTimes' + videoID;
chrome.storage.sync.get([sponsorTimeKey, "userID"], async function(result) {
let sponsorTimes = result[sponsorTimeKey];
let userID = result.userID;
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
//submit these times
for (let i = 0; i < sponsorTimes.length; i++) {
getUserID(function(userIDStorage) {
//submit the sponsorTime
sendRequestToServer('GET', "/api/postVideoSponsorTimes?videoID=" + videoID + "&startTime=" + sponsorTimes[i][0] + "&endTime=" + sponsorTimes[i][1]
+ "&userID=" + userIDStorage, function(xmlhttp, error) {
if (xmlhttp.readyState == 4 && !error) {
callback({
statusCode: xmlhttp.status
});
} else if (error) {
callback({
statusCode: -1
});
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
let durationResult = await new Promise((resolve, reject) => {
chrome.tabs.query({
active: true,
currentWindow: true
}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
message: "getVideoDuration"
}, (response) => resolve(response));
});
});
//check if a sponsor exceeds the duration of the video
for (let i = 0; i < sponsorTimes.length; i++) {
if (sponsorTimes[i][1] > durationResult.duration) {
sponsorTimes[i][1] = durationResult.duration;
}
}
});
});
}
//add these to the storage log
chrome.storage.sync.get(["sponsorTimesContributed"], function(result) {
let currentContributionAmount = 0;
if (result.sponsorTimesContributed != undefined) {
//current contribution amount is known
currentContributionAmount = result.sponsorTimesContributed;
//submit these times
for (let i = 0; i < sponsorTimes.length; i++) {
//submit the sponsorTime
sendRequestToServer("GET", "/api/postVideoSponsorTimes?videoID=" + videoID + "&startTime=" + sponsorTimes[i][0] + "&endTime=" + sponsorTimes[i][1]
+ "&userID=" + userID, function(xmlhttp, error) {
if (xmlhttp.readyState == 4 && !error) {
callback({
statusCode: xmlhttp.status
});
if (xmlhttp.status == 200) {
//add these to the storage log
chrome.storage.sync.get(["sponsorTimesContributed"], function(result) {
let currentContributionAmount = 0;
if (result.sponsorTimesContributed != undefined) {
//current contribution amount is known
currentContributionAmount = result.sponsorTimesContributed;
}
//save the amount contributed
chrome.storage.sync.set({"sponsorTimesContributed": currentContributionAmount + sponsorTimes.length});
});
}
} else if (error) {
callback({
statusCode: -1
});
}
});
}
}
//save the amount contributed
chrome.storage.sync.set({"sponsorTimesContributed": currentContributionAmount + sponsorTimes.length});
});
}
});
}
function videoIDChange(currentVideoID) {
//warn them if they had unsubmitted times
if (previousVideoID != null) {
//get the sponsor times from storage
let sponsorTimeKey = 'sponsorTimes' + previousVideoID;
chrome.storage.sync.get([sponsorTimeKey], function(result) {
let sponsorTimes = result[sponsorTimeKey];
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
//warn them that they have unsubmitted sponsor times
chrome.notifications.create("stillThere" + Math.random(), {
type: "basic",
title: "Do you want to submit the sponsor times for watch?v=" + previousVideoID + "?",
message: "You seem to have left some sponsor times unsubmitted. Go back to that page to submit them (they are not deleted).",
iconUrl: "./icons/LogoSponsorBlocker256px.png"
});
}
//set the previous video id to the currentID
previousVideoID = currentVideoID;
});
} else {
previousVideoID = currentVideoID;
}
}
function getUserID(callback) {
if (userID != null) {
callback(userID);
return;
}
//if it is not cached yet, grab it from storage
chrome.storage.sync.get(["userID"], function(result) {
let userIDStorage = result.userID;
if (userIDStorage != undefined) {
userID = userIDStorage;
callback(userID);
} else {
//generate a userID
userID = generateUUID();
//save this UUID
chrome.storage.sync.set({"userID": userID});
callback(userID);
}
});
}
function sendRequestToServer(type, address, callback) {
let xmlhttp = new XMLHttpRequest();
let xmlhttp = new XMLHttpRequest();
xmlhttp.open(type, serverAddress + address, true);
xmlhttp.open(type, serverAddress + address, true);
if (callback != undefined) {
xmlhttp.onreadystatechange = function () {
callback(xmlhttp, false);
};
if (callback != undefined) {
xmlhttp.onreadystatechange = function () {
callback(xmlhttp, false);
};
xmlhttp.onerror = function(ev) {
callback(xmlhttp, true);
};
}
xmlhttp.onerror = function(ev) {
callback(xmlhttp, true);
};
}
//submit this request
xmlhttp.send();
//submit this request
xmlhttp.send();
}
function getYouTubeVideoID(url) { // Return video id or false
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
var match = url.match(regExp);
return (match && match[7].length == 11) ? match[7] : false;
function generateUserID(length = 36) {
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
if (window.crypto && window.crypto.getRandomValues) {
values = new Uint32Array(length);
window.crypto.getRandomValues(values);
for (i = 0; i < length; i++) {
result += charset[values[i] % charset.length];
}
return result;
} else {
for (let i = 0; i < length; i++) {
result += charset[Math.floor(Math.random() * charset.length)];
}
return result;
}
}
//uuid generator function from https://gist.github.com/jed/982883
function generateUUID(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,generateUUID)}

View File

@@ -1,3 +1,33 @@
#previewbar {
overflow: visible;
padding: 0;
margin: 0;
position: absolute;
width: 100%;
pointer-events: none;
height: 100%;
transform: scaleY(0.6) translateY(-30%) translateY(1.5px);
z-index: 40;
}
.previewbar {
display: inline-block;
height: 100%;
}
.popup {
z-index: 10;
width: 100%;
height: 500px;
}
.smallLink {
font-size: 10px;
text-decoration: underline;
cursor: pointer;
}
.playerButtonImage {
height: 60%;
top: 0;
@@ -11,16 +41,16 @@
}
.sponsorSkipObject {
font-family: 'Source Sans Pro', sans-serif;
font-family: Roboto, Arial, Helvetica, sans-serif;
margin-left: 2px;
margin-right: 2px;
}
.sponsorSkipLogo {
height: 64px;
position: absolute;
top: 0;
bottom: 0;
margin: auto;
margin-left: 10px;
height: 18px;
float: left;
}
@keyframes fadeIn {
@@ -28,32 +58,119 @@
to { opacity: 1; }
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
.sponsorBlockSpacer {
background-color: rgb(100, 100, 100);
border-color: rgb(100, 100, 100);
margin-left: 5px;
}
.sponsorSkipNotice {
min-height: 165px;
min-width: 400px;
background-color: rgba(255, 217, 217, 0.8);
min-width: 300px;
background-color: rgba(28, 28, 28, 0.9);
position: absolute;
z-index: 1;
border: 3px solid rgba(0, 0, 0, 0.8);
margin-top: -50px;
right: 5px;
bottom: 100px;
right: 10px;
border-radius: 5px;
animation: fadeIn 0.5s;
border-spacing: 5px 10px;
padding-left: 5px;
padding-right: 5px;
}
.sponsorSkipNoticeFadeOut {
animation: fadeOut 3s cubic-bezier(0.55, 0.055, 0.675, 0.19);
}
.sponsorSkipNoticeTimeLeft {
color: #eeeeee;
border-radius: 4px;
padding: 2px 5px;
font-size: 12px;
border: 1px solid #eeeeee;
}
/* if two are very close to eachother */
.secondSkipNotice {
margin-left: 500px;
bottom: 250px;
transition: margin-left 0.2s;
transition: bottom 0.2s;
}
.sponsorSkipNoticeUnskipSection {
float: left;
border-left: 1px solid rgb(150, 150, 150);
}
.sponsorSkipNoticeButton {
background: none;
color: rgb(235, 235, 235);
border: none;
display: inline-block;
cursor: pointer;
margin-right: 10px;
padding: 2px 5px;
}
.sponsorSkipNoticeButton:hover {
background-color: rgba(235, 235, 235,0.2);
border-radius: 4px;
transition: background-color 0.4s;
}
.sponsorTimesVoteButtonsContainer {
float: left;
padding: 2px 5px;
margin-right: 4px;
}
.sponsorSkipNoticeRightSection {
right: 0;
position: absolute;
float: right;
margin-right: 5px;
}
.sponsorSkipNoticeRightButton {
margin-right: 0;
}
.sponsorSkipNoticeCloseButton {
height: 10px;
width: 10px;
padding: 2px 5px;
margin-left: 2px;
float: right;
}
.sponsorSkipMessage {
font-size: 18px;
color: #000000;
text-align: center;
margin-top: 10px;
font-size: 14px;
font-weight: bold;
margin-top: 4px;
color: rgb(235, 235, 235);
display: inline-block;
}
.sponsorSkipInfo {
@@ -80,16 +197,18 @@
margin-top: 0px;
}
.sponsorTimesVoteButtonMessage {
float: left;
}
.sponsorTimesInfoMessage {
font-size: 15px;
font-weight: bold;
color: #000000;
font-size: 13.3333px;
color: rgb(235, 235, 235);
text-align: center;
}
.voteButton {
height: 32px;
margin-right: 15px;
height: 17px;
cursor: pointer;
}
.voteButton:hover {

1400
content.js

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
{
"browser_specific_settings": {
"gecko": {
"id": "sponsorBlocker@ajay.app",
"strict_min_version": "57.0"
}
}
}

View File

@@ -1,61 +0,0 @@
{
"name": "SponsorBlock - YouTube Sponsorship Blocker",
"short_name": "SponsorBlock",
"version": "1.0.1",
"description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.",
"content_scripts": [
{
"matches": [
"https://*.youtube.com/*"
],
"js": [
"config.js",
"content.js"
],
"css": [
"content.css",
"./libs/Source+Sans+Pro.css"
]
}
],
"web_accessible_resources": [
"icons/LogoSponsorBlocker256px.png",
"icons/IconSponsorBlocker256px.png",
"icons/PlayerStartIconSponsorBlocker256px.png",
"icons/PlayerStopIconSponsorBlocker256px.png",
"icons/PlayerUploadIconSponsorBlocker256px.png",
"icons/PlayerUploadFailedIconSponsorBlocker256px.png",
"icons/upvote.png",
"icons/downvote.png"
],
"permissions": [
"tabs",
"storage",
"notifications",
"https://sponsor.ajay.app/*"
],
"browser_action": {
"default_title": "SponsorBlock",
"default_popup": "popup.html"
},
"background": {
"scripts":[
"config.js",
"background.js"
]
},
"icons": {
"16": "icons/IconSponsorBlocker16px.png",
"32": "icons/IconSponsorBlocker32px.png",
"64": "icons/LogoSponsorBlocker64px.png",
"128": "icons/LogoSponsorBlocker128px.png",
"256": "icons/LogoSponsorBlocker256px.png"
},
"browser_specific_settings": {
"gecko": {
"id": "sponsorBlocker@ajay.app",
"strict_min_version": "57.0"
}
},
"manifest_version": 2
}

123
help/index_en.html Normal file
View File

@@ -0,0 +1,123 @@
<head>
<title> SponsorBlock </title>
<link href="styles.css" rel="stylesheet"/>
</head>
<body>
<div id="title">
<img src="https://github.com/ajayyy/SponsorBlock/raw/master/icons/LogoSponsorBlocker256px.png" height="80" class="profilepic"/>
SponsorBlock
</div>
<center>
<p class="createdBy">Created By <a href="https://ajay.app">Ajay Ramachandran</a></p>
<p>
Thanks for installing SponsorBlock. Here are some quick tips for getting started. Please join the Discord if you have any questions or suggestions.
</p>
<p class="projectPreview">
<span class="projectPreviewImage">
<a href="https://discord.gg/QnmVMpU"><img width="80" src="https://www.logolynx.com/images/logolynx/1b/1bcc0f0aefe71b2c8ce66ffe8645d365.png"/></a>
</span>
Come contribute, make some suggestions and help out in the Discord: <a href="https://discord.gg/QnmVMpU">https://discord.gg/QnmVMpU</a>
</p>
<h1>How skipping works</h1>
<p class="projectPreview">
<span class="projectPreviewImageLarge">
<img src="https://i.imgur.com/caf5Bju.png">
</span>
Videos will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are.
<br/>
<br/>
Whenever you skip a video, you will get a notice report that submission. If the timing seems wrong, report it! You can also vote in the popup. The extension auto upvotes it if you don't report it, so make sure to report when necessary.
</p>
<center><img height="120px" src="https://user-images.githubusercontent.com/12688112/63067735-5a638700-bede-11e9-8147-f321b57527ec.gif"></center>
<h1>Submitting</h1>
<p class="projectPreview">
<span class="projectPreviewImageLargeRight">
<img src="https://i.imgur.com/A1ilk6x.gif">
</span>
Submitting can either be done in the popup by hitting the "Sponsorship Starts Now" button or in the video player with the buttons on the player.
<br/>
<br/>
Clicking the play button indicated the start of a sponsorship section and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete.
</p>
<h1>Editing</h1>
<p class="projectPreview">
<span class="projectPreviewImageLarge">
<img src="https://i.imgur.com/DZHqbsx.gif">
</span>
If you messed up, you can edit or delete your sponsor times in the popup or in the info menu (by hitting the info icon).
</p>
<h1>This is too slow</h1>
<p>
There are hotkeys if you want to use them. You must be focused on the YouTube player to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the appostrophe to submit.
</p>
<h1>I hate these buttons, they are so ugly</h1>
<p>
All player buttons can be hidden in the options.
</p>
<h1>Can I get a copy of the Database? What happens if you disappear?</h1>
<p>
The database is public and available at <a href="https://sponsor.ajay.app/database.db">https://sponsor.ajay.app/database.db</a>. The source code is freely available. So, even if something happens to me, your submissions are not lost.
</p>
<h1>News and how it is made</h1>
<p>
See <a href="https://sponsor.ajay.app/news">https://sponsor.ajay.app/news</a>.
</p>
<h1>I want more features!</h1>
<p>
Ask on Discord or make an Issue on GitHub. I am happy to hear suggestions or improvements you want. You may also contribute code or graphics if you would like.
</p>
<h1>Where can I get the source code</h1>
<h4 style="display: inline">Client:</h4>
<!-- Github logo -->
<a href="https://github.com/ajayyy/SponsorBlock"><svg aria-hidden="true" version="1.1" viewBox="0 0 16 16" height="58px" style="padding-left: 15px"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a>
<h4 style="display: inline; padding-left: 20px">Server:</h4>
<!-- Github logo -->
<a href="https://github.com/ajayyy/SponsorBlockServer"><svg aria-hidden="true" version="1.1" viewBox="0 0 16 16" height="58px" style="padding-left: 15px"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a>
<h1>Credit</h1>
<p>The awesome <a href="https://github.com/omarroth/invidious/wiki/API">Invidious API</a> is used to grab the time the video was published.</p>
<p>Some icons made by <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p>
<p>Some icons made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p>
</center>
</body>

176
help/styles.css Normal file
View File

@@ -0,0 +1,176 @@
:not(.hljs-keyword):not(.hljs-comment):not(.hljs-number):not(.hljs-string):not(pre):not(code) {
background-color: #333333;
}
.projectPreview {
position: relative;
}
.projectPreviewImage {
position: absolute;
left: -90;
width: 80;
top: 50%;
transform: translateY(-50%);
}
.projectPreviewImageLarge {
position: absolute;
left: -210;
width: 200;
top: 50%;
transform: translateY(-20%);
}
.projectPreviewImageLargeRight {
position: absolute;
right: -210;
width: 200;
top: 50%;
transform: translateY(-50%);
}
.createdBy {
font-size: 14px;
text-align: center;
padding-top: 0px;
padding-bottom: 0px;
}
#title {
background-color: #636363;
text-align: center;
vertical-align: middle;
font-family: sans-serif;
font-size: 50;
color: #212121;
/* height: 100; */
padding: 20;
text-decoration: none;
transition: font-size 1s;
}
#title:hover {
font-size: 60;
transition: font-size 1s;
}
.subtitle {
font-family: sans-serif;
font-size: 40;
color: #dad8d8;
padding-top: 10;
transition: font-size 0.4s;
}
.subtitle:hover {
font-size: 45;
transition: font-size 0.4s;
}
.profilepic {
background-color: #636363 !important;
vertical-align: middle;
}
a {
text-decoration: underline;
color: inherit;
}
.link {
padding: 20;
height: 80px;
transition: height 0.2s;
}
.link:hover {
height: 95px;
transition: height 0.2s;
}
#contact,.smalllink {
font-family: sans-serif;
font-size: 25;
color: #e8e8e8;
text-align: center;
padding: 10;
}
#contact {
text-decoration: none;
}
p,li {
font-family: sans-serif;
font-size: 20;
color: #c4c4c4;
padding: 10;
}
p,li,code,a {
max-width: 60%;
text-align: left;
overflow-wrap: break-word;
}
@media screen and (orientation:portrait) {
p,li,code,a {
max-width: 100%;
}
.projectPreviewImage {
position: unset;
width: 130;
display: block;
margin: auto;
transform: none;
}
}
.previewImage {
max-height: 200px;
}
img {
max-width: 100%;
text-align: center;
}
#recentPostTitle {
font-family: sans-serif;
font-size: 30;
color: #dad8d8;
}
#recentPostDate {
font-family: sans-serif;
font-size: 15;
color: #dad8d8;
}
h1,h2,h3,h4,h5,h6 {
font-family: sans-serif;
color: #dad8d8;
}
svg {
text-decoration: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
icons/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
icons/report.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,20 +1,28 @@
{
"name": "SponsorBlock - YouTube Sponsorship Blocker",
"short_name": "SponsorBlock",
"version": "1.0.1",
"description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.",
"name": "__MSG_fullName__",
"short_name": "__MSG_Name__",
"version": "1.1.4",
"default_locale": "en",
"description": "__MSG_Description__",
"content_scripts": [
{
"matches": [
"https://*.youtube.com/*"
"https://*.youtube.com/*",
"https://www.youtube-nocookie.com/embed/*"
],
"all_frames": true,
"js": [
"config.js",
"content.js"
"utils/previewBar.js",
"utils/skipNotice.js",
"utils.js",
"content.js",
"popup.js"
],
"css": [
"content.css",
"./libs/Source+Sans+Pro.css"
"./libs/Source+Sans+Pro.css",
"popup.css"
]
}
],
@@ -26,23 +34,29 @@
"icons/PlayerUploadIconSponsorBlocker256px.png",
"icons/PlayerUploadFailedIconSponsorBlocker256px.png",
"icons/upvote.png",
"icons/downvote.png"
"icons/downvote.png",
"icons/report.png",
"icons/close.png",
"icons/PlayerInfoIconSponsorBlocker256px.png",
"icons/PlayerDeleteIconSponsorBlocker256px.png",
"popup.html"
],
"permissions": [
"tabs",
"storage",
"notifications",
"https://sponsor.ajay.app/*"
],
"browser_action": {
"default_title": "SponsorBlock",
"default_title": "__MSG_Name__",
"default_popup": "popup.html"
},
"background": {
"scripts":[
"utils.js",
"config.js",
"background.js"
]
],
"persistent": false
},
"icons": {
"16": "icons/IconSponsorBlocker16px.png",

181
popup.css
View File

@@ -1,57 +1,154 @@
* {
font-family: 'Source Sans Pro', sans-serif;
/* reset some properties to default (youtube messes with them */
p.popupElement {
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0px;
margin-inline-end: 0px;
}
h1 {
h1.popupElement {
margin-block-start: 0.67em;
margin-block-end: 0.67em;
margin-inline-start: 0px;
margin-inline-end: 0px;
font-weight: bold;
}
h2.popupElement {
margin-block-start: 0.83em;
margin-block-end: 0.83em;
margin-inline-start: 0px;
margin-inline-end: 0px;
font-weight: bold;
}
h3.popupElement {
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0px;
margin-inline-end: 0px;
font-weight: bold;
}
sub.popupElement {
font-size: smaller;
}
/* end reset */
.popupElement {
font-family: 'Source Sans Pro', sans-serif;
color: black;
}
h1.popupElement {
margin-top: 0px;
}
body {
font-size: 14px;
width: 300px;
background-color: #ffd9d9;
.popupBody {
font-size: 14px;
background-color: #ffd9d9;
padding: 5px;
}
.recordingSubtitle {
.discreteLink.popupElement {
color: black;
}
.recordingSubtitle.popupElement {
margin-bottom: 10px;
}
.voteButton {
.voteButton.popupElement {
height: 32px;
margin-right: 15px;
cursor: pointer;
}
.voteButton:hover {
.voteButton:hover.popupElement {
filter: brightness(80%);
}
.greenButton {
background-color:#ec1c1c;
-moz-border-radius:28px;
-webkit-border-radius:28px;
border-radius:28px;
border:1px solid #d31919;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-size:16px;
padding:8px 37px;
text-decoration:none;
text-shadow:0px 0px 0px #662727;
#discordButtonContainer.popupElement {
font-size: 12px;
}
.greenButton:hover {
background-color:#bf2a2a;
.sponsorTime.popupElement {
font-size: 20px;
}
.greenButton:focus {
.smallLink.popupElement {
font-size: 10px;
text-decoration: underline;
cursor: pointer;
}
.mediumLink.popupElement {
font-size: 15px;
margin-left: 25px;
margin-right: 25px;
text-decoration: underline;
cursor: pointer;
}
.tinyLink.popupElement {
font-size: 10px;
text-decoration: underline;
cursor: pointer;
}
.whitelistButton.popupElement {
background-color:#3acc3a;
-moz-border-radius:28px;
-webkit-border-radius:28px;
border-radius:28px;
border: none;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-size:16px;
padding:8px 37px;
text-decoration:none;
text-shadow:0px 0px 0px #27663c;
}
.whitelistButton:hover.popupElement {
background-color:#218b26;
}
.whitelistButton:focus.popupElement {
outline: none;
background-color:#218b26;
}
.whitelistButton:active.popupElement {
position:relative;
top:1px;
}
.greenButton.popupElement {
background-color:#ec1c1c;
-moz-border-radius:28px;
-webkit-border-radius:28px;
border-radius:28px;
border:1px solid #d31919;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-size:16px;
padding:8px 37px;
text-decoration:none;
text-shadow:0px 0px 0px #662727;
}
.greenButton:hover.popupElement {
background-color:#bf2a2a;
}
.greenButton:focus.popupElement {
outline: none;
background-color:#bf2a2a;
}
.greenButton:active {
position:relative;
top:1px;
.greenButton:active.popupElement {
position:relative;
top:1px;
}
.dangerButton {
.dangerButton.popupElement {
-moz-box-shadow:inset 0px 1px 0px 0px #cf866c;
-webkit-box-shadow:inset 0px 1px 0px 0px #cf866c;
box-shadow:inset 0px 1px 0px 0px #cf866c;
@@ -68,19 +165,19 @@ body {
text-decoration:none;
text-shadow:0px 1px 0px #854629;
}
.dangerButton:hover {
.dangerButton:hover.popupElement {
background-color:#bc3315;
}
.dangerButton:focus {
.dangerButton:focus.popupElement {
outline: none;
background-color:#bc3315;
}
.dangerButton:active {
.dangerButton:active.popupElement {
position:relative;
top:1px;
}
.warningButton {
.warningButton.popupElement {
-moz-box-shadow:inset 0px 1px 0px 0px #cfbd6c;
-webkit-box-shadow:inset 0px 1px 0px 0px #cfbd6c;
box-shadow:inset 0px 1px 0px 0px #cfbd6c;
@@ -97,19 +194,19 @@ body {
text-decoration:none;
text-shadow:0px 1px 0px #856829;
}
.warningButton:hover {
.warningButton:hover.popupElement {
background-color:#bc8215;
}
.warningButton:focus {
.warningButton:focus.popupElement {
outline: none;
background-color:#bc8215;
}
.warningButton:active {
.warningButton:active.popupElement {
position:relative;
top:1px;
}
.smallButton {
.smallButton.popupElement {
background-color:#f9902d;
-moz-border-radius:3px;
-webkit-border-radius:3px;
@@ -122,14 +219,14 @@ body {
padding:6px 10px;
text-decoration:none;
}
.smallButton:hover {
.smallButton:hover.popupElement {
background-color:#fa9806;
}
.smallButton:focus {
.smallButton:focus.popupElement {
outline: none;
background-color:#fa9806;
}
.smallButton:active {
.smallButton:active.popupElement {
position:relative;
top:1px;
}
}

View File

@@ -1,128 +1,233 @@
<html>
<head>
<title>Set Page Color Popup</title>
<link rel="stylesheet" type="text/css" href="/libs/Source+Sans+Pro.css"/>
<link rel="stylesheet" type="text/css" href="popup.css"/>
<title>SponsorBlock Popup</title>
<link id="sponorBlockPopupFont" rel="stylesheet" type="text/css" href="/libs/Source+Sans+Pro.css"/>
<link id="sponorBlockStyleSheet" rel="stylesheet" type="text/css" href="popup.css"/>
</head>
<center>
<div id="app">
<img src="icons/LogoSponsorBlocker256px.png" height="64px"/>
<body class="popupBody">
<center>
<div id="app" class="popupBody">
<img src="icons/LogoSponsorBlocker256px.png" height="64px" id="sponsorBlockPopupLogo"/>
<h1>SponsorBlock</h1>
<h1 class="popupElement">SponsorBlock</h1>
<!-- Loading text -->
<p id="loadingIndicator">Loading...</p>
<!-- Hidden until loading complete -->
<div id="mainControls" class="main" style="display: none">
<!-- If the video was found in the database -->
<div id="videoFound">
</div>
<div id="downloadedSponsorMessageTimes">
</div>
<br/>
<button id="reportAnIssue" class="dangerButton">Vote On A Sponsor Time</button>
<div id="issueReporterContainer" style="display: none">
<h3 style="margin-top: 0px">Vote On A Sponsor Time</h3>
<div id="issueReporterTimeButtons">
<!-- Loading text -->
<p id="loadingIndicator" class="popupElement">Loading...</p>
<!-- Hidden until loading complete -->
<div id="mainControls" class="main popupElement" style="display: none">
<!-- If the video was found in the database -->
<div id="videoFound">
</div>
</div>
<div id="downloadedSponsorMessageTimes" class="popupElement">
<h2 class="recordingSubtitle">Record the times of a sponsorship</h2>
</div>
<br/>
<p>
<span id=sponsorTimesContributionsContainer style="display: none">
So far, you've submitted
<span id="sponsorTimesContributionsDisplay">
0
</span>
<span id="sponsorTimesContributionsDisplayEndWord">
sponsors.
</span>
</span>
<div>
<button id="whitelistChannel" class="whitelistButton popupElement">Whitelist Channel</button>
<button id="unwhitelistChannel" class="whitelistButton popupElement" style="display: none">Remove Channel From Whitelist</button>
</div>
<sub class="popupElement">
Whitelist the channels who do sponsorships ethically to encourage good behavior, or maybe if they are just entertaining and funny. Or don't, that's your call.
</sub>
<span id=sponsorTimesViewsContainer style="display: none">
You have saved people from
<span id="sponsorTimesViewsDisplay">
0
</span>
<span id="sponsorTimesViewsDisplayEndWord">
sponsor segments.
</span>
</span>
</p>
<p>
Click the button below when the sponsorship starts and ends to record and
submit it to the database.
</p>
<div>
<button id="sponsorStart" class="greenButton">Sponsorship Starts Now</button>
</div>
<div id="submissionSection" style="display: none">
<h3>Latest Sponsor Message Times Chosen</h3>
<b>
<div id="sponsorMessageTimes">
</div>
</b>
<button id="clearTimes" class="smallButton">Clear Times</button>
<br/>
<br/>
<div id="submitTimesContainer" style="display: none">
<button id="submitTimes" class="smallButton">Submit Times</button>
<button id="reportAnIssue" class="dangerButton popupElement">Vote On A Sponsor Time</button>
<div id="submitTimesInfoMessageContainer" style="display: none">
<h3 id="submitTimesInfoMessage">
<div id="issueReporterContainer" class="popupElement" style="display: none">
<h3 style="margin-top: 0px" class="popupElement">Vote On A Sponsor Time</h3>
<div id="issueReporterTimeButtons" class="popupElement">
</h3>
</div>
</div>
</div>
<div id="optionsButtonContainer">
<br/>
<br/>
<button id="optionsButton" class="dangerButton">Options</button>
</div>
<h2 class="recordingSubtitle popupElement">Record the times of a sponsorship</h2>
<div id="options" style="display: none">
<br/>
<p class="popupElement">
<span id=sponsorTimesContributionsContainer class="popupElement" style="display: none">
So far, you've submitted
<span id="sponsorTimesContributionsDisplay" class="popupElement">
0
</span>
<span id="sponsorTimesContributionsDisplayEndWord" class="popupElement">
sponsors.
</span>
</span>
<h3>Options</h3>
<span id=sponsorTimesViewsContainer class="popupElement" style="display: none">
You have saved people from
<span id="sponsorTimesViewsDisplay" class="popupElement">
0
</span>
<span id="sponsorTimesViewsDisplayEndWord" class="popupElement">
sponsor segments.
</span>
</span>
<div class="popupElement">
View the leaderboard <a class="popupElement discreteLink" href="https://sponsor.ajay.app/stats" target="_blank">here</a>.
</div>
</p>
<p class="popupElement">
Click the button below when the sponsorship starts and ends to record and
submit it to the database.
</p>
<button id="hideVideoPlayerControls" class="warningButton">Hide Button On YouTube Player</button>
<button id="showVideoPlayerControls" style="display: none" class="warningButton">Show Button On YouTube Player</button>
<div>
<button id="sponsorStart" class="greenButton popupElement">Sponsorship Starts Now</button>
</div>
<sub class="popupElement">Hint: Press the semicolon key while focused on a video report the start/end of a sponsor and quote to submit.</sub>
<br/>
<br/>
<div id="submissionSection" class="popupElement" style="display: none">
<h3 class="popupElement">Latest Sponsor Message Times Chosen</h3>
<b>
<div id="sponsorMessageTimes" class="popupElement">
<button id="showNoticeAgain" style="display: none" class="dangerButton">Show Notice Again</button>
</div>
</b>
<br/>
<button id="clearTimes" class="smallButton popupElement">Clear Times</button>
<br/>
<br/>
<div id="submitTimesContainer" class="popupElement" style="display: none">
<button id="submitTimes" class="smallButton popupElement">Submit Times</button>
<div id="submitTimesInfoMessageContainer" class="popupElement" style="display: none">
<h3 id="submitTimesInfoMessage" class="popupElement">
</h3>
</div>
</div>
</div>
<div id="setUsernameContainer" class="popupElement">
<br/>
<br/>
<button id="setUsernameButton" class="warningButton popupElement">Set Username</button>
<br/>
<sub class="popupElement">
This is used on the public stats page to show off how much you've contributed. See it <a class="popupElement discreteLink" href="https://sponsor.ajay.app/stats" target="_blank">here</a>.
</sub>
</div>
<div id="setUsername" class="popupElement" style="display: none">
<br/>
<h3>Set Username</h3>
<div id="setUsernameStatusContainer" style="display: none">
<h2 id="setUsernameStatus"></h2>
</div>
<input id="usernameInput" hint="Username"></input>
<br/>
<br/>
<button id="submitUsername" class="warningButton popupElement">Submit Username</button>
</div>
<div id="discordButtonContainer" class="popupElement" style="display: none">
<br/>
<a href="https://discord.gg/QnmVMpU" class="popupElement" target="_blank"><img src="https://www.logolynx.com/images/logolynx/1b/1bcc0f0aefe71b2c8ce66ffe8645d365.png" height="32px"/></a>
<br/>
Come join the official discord server to give suggestions and feedback!
<br/>
<span id="hideDiscordButton" class="smallLink popupElement">Hide this</span>
</div>
<div id="optionsButtonContainer" class="popupElement">
<br/>
<br/>
<button id="optionsButton" class="dangerButton popupElement">Options</button>
</div>
<div id="options" class="popupElement" style="display: none">
<br/>
<h3>Options</h3>
<button id="hideVideoPlayerControls" class="warningButton popupElement">Hide Buttons On YouTube Player</button>
<button id="showVideoPlayerControls" style="display: none" class="warningButton popupElement">Show Buttons On YouTube Player</button>
<br/>
<sub class="popupElement">
This hides the buttons that appear on the YouTube player to submit sponsors. I can see this being annoying for some
people. Instead of using the button there, this popup can be used to submit sponsors. To hide the notice that appears,
use the button that appears on the notice saying "Don't show this again". You can always enable these settings again
later.
</sub>
<br/>
<br/>
<button id="hideInfoButtonPlayerControls" class="warningButton popupElement">Hide Info Button On YouTube Player</button>
<button id="showInfoButtonPlayerControls" style="display: none" class="warningButton popupElement">Show Info Button On YouTube Player</button>
<br/>
<sub class="popupElement">
This is the button that opens up a popup in the YouTube page.
</sub>
<br/>
<br/>
<button id="hideDeleteButtonPlayerControls" class="warningButton popupElement">Hide Delete Button On YouTube Player</button>
<button id="showDeleteButtonPlayerControls" style="display: none" class="warningButton popupElement">Show Delete Button On YouTube Player</button>
<br/>
<sub class="popupElement">
This is the button that allows you to clear all sponsors on the YouTube player.
</sub>
<br/>
<br/>
<button id="disableSponsorViewTracking" class="warningButton popupElement">Disable Sponsor View Tracking</button>
<button id="enableSponsorViewTracking" style="display: none" class="warningButton popupElement">Enable Sponsor View Tracking</button>
<br/>
<sub class="popupElement">
This feature tracks which sponsors you have skipped to let users know how much their submission has helped others and
used as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message
to the server each time you skip a sponsor. Hopefully most people don't change this setting so that the view numbers
are accurate. :)
</sub>
<br/>
<br/>
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">Show Notice Again</button>
</div>
</div>
</div>
</div>
</center>
</center>
</body>
<!-- Scripts that need to load after the html -->
<script src="config.js"></script>
<script src="utils.js"></script>
<script src="popup.js"></script>
</html>
</html>

1785
popup.js

File diff suppressed because it is too large Load Diff

41
utils.js Normal file
View File

@@ -0,0 +1,41 @@
// Function that can be used to wait for a condition before returning
async function wait(condition, timeout = 5000, check = 100) {
return await new Promise((resolve, reject) => {
setTimeout(() => {reject("TIMEOUT")}, timeout);
const interval = setInterval(() => {
let result = condition();
if (result !== false) {
resolve(result);
clearInterval(interval);
};
}, check);
});
}
function getYouTubeVideoID(url) {
//Attempt to parse url
let urlObject = null;
try {
urlObject = new URL(url);
} catch (e) {
console.error("[SB] Unable to parse URL: " + url);
return false;
}
//Check if valid hostname
if(!["www.youtube.com","www.youtube-nocookie.com"].includes(urlObject.host)) return false;
//Get ID from searchParam
if ((urlObject.pathname == "/watch" || urlObject.pathname == "/watch/") && urlObject.searchParams.has("v")) {
id = urlObject.searchParams.get("v");
return id.length == 11 ? id : false;
} else if (urlObject.pathname.startsWith("/embed/")) {
try {
return urlObject.pathname.substr(7, 11);
} catch (e) {
console.error("[SB] Video ID not valid for " + url);
return false;
}
}
return false;
}

90
utils/previewBar.js Normal file
View File

@@ -0,0 +1,90 @@
/*
This is based on code from VideoSegments.
https://github.com/videosegments/videosegments/commits/f1e111bdfe231947800c6efdd51f62a4e7fef4d4/segmentsbar/segmentsbar.js
*/
'use strict';
let barTypes = {
"undefined": {
color: "#00d400",
opacity: "0.5"
},
"sponsor": {
color: "#00d400",
opacity: "0.5"
},
"previewSponsor": {
color: "#0000d4",
opacity: "0.5"
}
};
class PreviewBar {
constructor(parent) {
this.container = document.createElement('ul');
this.container.id = 'previewbar';
this.parent = parent;
this.bars = []
this.updatePosition();
}
updatePosition() {
//below the seek bar
// this.parent.insertAdjacentElement("afterEnd", this.container);
//on the seek bar
this.parent.insertAdjacentElement("afterBegin", this.container);
}
updateColor(segment, color, opacity) {
let bars = document.querySelectorAll('[data-vs-segment-type=' + segment + ']');
for (let bar of bars) {
bar.style.backgroundColor = color;
bar.style.opacity = opacity;
}
}
set(timestamps, types, duration) {
while (this.container.firstChild) {
this.container.removeChild(this.container.firstChild);
}
if (!timestamps || !types) {
return;
}
// to avoid rounding error resulting in width more than 100%
duration = Math.floor(duration * 100) / 100;
let width;
for (let i = 0; i < timestamps.length; i++) {
width = (timestamps[i][1] - timestamps[i][0]) / duration * 100;
width = Math.floor(width * 100) / 100;
let bar = this.createBar();
bar.setAttribute('data-vs-segment-type', types[i]);
bar.style.backgroundColor = barTypes[types[i]].color;
bar.style.opacity = barTypes[types[i]].opacity;
bar.style.width = width + '%';
bar.style.left = (timestamps[i][0] / duration * 100) + "%";
bar.style.position = "absolute"
this.container.insertAdjacentElement('beforeEnd', bar);
this.bars[i] = bar;
}
}
createBar() {
let bar = document.createElement('li');
bar.classList.add('previewbar');
bar.innerHTML = '&nbsp;';
return bar;
}
remove() {
this.container.remove();
this.container = undefined;
}
}

367
utils/skipNotice.js Normal file
View File

@@ -0,0 +1,367 @@
'use strict';
//The notice that tells the user that a sponsor was just skipped
class SkipNotice {
constructor(parent, UUID) {
this.parent = parent;
this.UUID = UUID;
this.maxCountdownTime = () => 4;
//the countdown until this notice closes
this.countdownTime = this.maxCountdownTime();
//the id for the setInterval running the countdown
this.countdownInterval = -1;
//the unskip button's callback
this.unskipCallback = this.unskip.bind(this);
//add notice
let amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
//this is the suffix added at the end of every id
this.idSuffix = this.UUID + amountOfPreviousNotices;
if (amountOfPreviousNotices > 0) {
//already exists
let previousNotice = document.getElementsByClassName("sponsorSkipNotice")[0];
previousNotice.classList.add("secondSkipNotice")
}
let noticeElement = document.createElement("div");
//what sponsor time this is about
noticeElement.id = "sponsorSkipNotice" + this.idSuffix;
noticeElement.classList.add("sponsorSkipObject");
noticeElement.classList.add("sponsorSkipNotice");
noticeElement.style.zIndex = 50 + amountOfPreviousNotices;
//add mouse enter and leave listeners
noticeElement.addEventListener("mouseenter", this.pauseCountdown.bind(this));
noticeElement.addEventListener("mouseleave", this.startCountdown.bind(this));
//the row that will contain the info
let firstRow = document.createElement("tr");
firstRow.id = "sponsorSkipNoticeFirstRow" + this.idSuffix;
let logoColumn = document.createElement("td");
let logoElement = document.createElement("img");
logoElement.id = "sponsorSkipLogo" + this.idSuffix;
logoElement.className = "sponsorSkipLogo sponsorSkipObject";
logoElement.src = chrome.extension.getURL("icons/IconSponsorBlocker256px.png");
let noticeMessage = document.createElement("span");
noticeMessage.id = "sponsorSkipMessage" + this.idSuffix;
noticeMessage.classList.add("sponsorSkipMessage");
noticeMessage.classList.add("sponsorSkipObject");
noticeMessage.innerText = chrome.i18n.getMessage("noticeTitle");
//create the first column
logoColumn.appendChild(logoElement);
logoColumn.appendChild(noticeMessage);
//add the x button
let closeButtonContainer = document.createElement("td");
closeButtonContainer.className = "sponsorSkipNoticeRightSection";
closeButtonContainer.style.top = "11px";
let timeLeft = document.createElement("span");
timeLeft.id = "sponsorSkipNoticeTimeLeft" + this.idSuffix;
timeLeft.innerText = this.countdownTime + "s";
timeLeft.className = "sponsorSkipObject sponsorSkipNoticeTimeLeft";
let hideButton = document.createElement("img");
hideButton.src = chrome.extension.getURL("icons/close.png");
hideButton.className = "sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton";
hideButton.addEventListener("click", this.close.bind(this));
closeButtonContainer.appendChild(timeLeft);
closeButtonContainer.appendChild(hideButton);
//add all objects to first row
firstRow.appendChild(logoColumn);
firstRow.appendChild(closeButtonContainer);
let spacer = document.createElement("hr");
spacer.id = "sponsorSkipNoticeSpacer" + this.idSuffix;
spacer.className = "sponsorBlockSpacer";
//the row that will contain the buttons
let secondRow = document.createElement("tr");
secondRow.id = "sponsorSkipNoticeSecondRow" + this.idSuffix;
//thumbs up and down buttons
let voteButtonsContainer = document.createElement("td");
voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + this.idSuffix;
voteButtonsContainer.className = "sponsorTimesVoteButtonsContainer"
let reportText = document.createElement("span");
reportText.id = "sponsorTimesReportText" + this.idSuffix;
reportText.className = "sponsorTimesInfoMessage sponsorTimesVoteButtonMessage";
reportText.innerText = chrome.i18n.getMessage("reportButtonTitle");
reportText.style.marginRight = "5px";
reportText.setAttribute("title", chrome.i18n.getMessage("reportButtonInfo"));
let downvoteButton = document.createElement("img");
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + this.idSuffix;
downvoteButton.className = "sponsorSkipObject voteButton";
downvoteButton.src = chrome.extension.getURL("icons/report.png");
downvoteButton.addEventListener("click", () => vote(0, this.UUID, this));
downvoteButton.setAttribute("title", chrome.i18n.getMessage("reportButtonInfo"));
//add downvote and report text to container
voteButtonsContainer.appendChild(reportText);
voteButtonsContainer.appendChild(downvoteButton);
//add unskip button
let unskipContainer = document.createElement("td");
unskipContainer.className = "sponsorSkipNoticeUnskipSection";
let unskipButton = document.createElement("button");
unskipButton.id = "sponsorSkipUnskipButton" + this.idSuffix;
unskipButton.innerText = chrome.i18n.getMessage("unskip");
unskipButton.className = "sponsorSkipObject sponsorSkipNoticeButton";
unskipButton.addEventListener("click", this.unskipCallback);
unskipButton.style.marginLeft = "4px";
unskipContainer.appendChild(unskipButton);
//add don't show again button
let dontshowContainer = document.createElement("td");
dontshowContainer.className = "sponsorSkipNoticeRightSection";
let dontShowAgainButton = document.createElement("button");
dontShowAgainButton.innerText = chrome.i18n.getMessage("Hide");
dontShowAgainButton.className = "sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton";
dontShowAgainButton.addEventListener("click", dontShowNoticeAgain);
dontshowContainer.appendChild(dontShowAgainButton);
//add to row
secondRow.appendChild(voteButtonsContainer);
secondRow.appendChild(unskipContainer);
secondRow.appendChild(dontshowContainer);
noticeElement.appendChild(firstRow);
noticeElement.appendChild(spacer);
noticeElement.appendChild(secondRow);
//get reference node
let referenceNode = document.getElementById("movie_player");
if (referenceNode == null) {
//for embeds
let player = document.getElementById("player");
referenceNode = player.firstChild;
let index = 1;
//find the child that is the video player (sometimes it is not the first)
while (!referenceNode.classList.contains("html5-video-player") || !referenceNode.classList.contains("ytp-embed")) {
referenceNode = player.children[index];
index++;
}
}
referenceNode.prepend(noticeElement);
this.startCountdown();
}
//called every second to lower the countdown before hiding the notice
countdown() {
this.countdownTime--;
if (this.countdownTime <= 0) {
//remove this from setInterval
clearInterval(this.countdownInterval);
//time to close this notice
this.close();
return;
}
if (this.countdownTime == 3) {
//start fade out animation
let notice = document.getElementById("sponsorSkipNotice" + this.idSuffix);
notice.style.removeProperty("animation");
notice.classList.add("sponsorSkipNoticeFadeOut");
}
this.updateTimerDisplay();
}
pauseCountdown() {
//remove setInterval
clearInterval(this.countdownInterval);
this.countdownInterval = -1;
//reset countdown
this.countdownTime = this.maxCountdownTime();
//inform the user
let timeLeft = document.getElementById("sponsorSkipNoticeTimeLeft" + this.idSuffix);
timeLeft.innerText = chrome.i18n.getMessage("paused");
//remove the fade out class if it exists
let notice = document.getElementById("sponsorSkipNotice" + this.idSuffix);
notice.classList.remove("sponsorSkipNoticeFadeOut");
notice.style.animation = "none";
}
startCountdown() {
//if it has already started, don't start it again
if (this.countdownInterval != -1) return;
this.countdownInterval = setInterval(this.countdown.bind(this), 1000);
this.updateTimerDisplay();
}
updateTimerDisplay() {
//update the timer display
let timeLeft = document.getElementById("sponsorSkipNoticeTimeLeft" + this.idSuffix);
timeLeft.innerText = this.countdownTime + "s";
}
unskip() {
unskipSponsorTime(this.UUID);
//change unskip button to a reskip button
let unskipButton = document.getElementById("sponsorSkipUnskipButton" + this.idSuffix);
unskipButton.innerText = chrome.i18n.getMessage("reskip");
unskipButton.removeEventListener("click", this.unskipCallback);
//setup new callback
this.unskipCallback = this.reskip.bind(this);
unskipButton.addEventListener("click", this.unskipCallback);
//change max duration to however much of the sponsor is left
this.maxCountdownTime = function() {
let sponsorTime = sponsorTimes[UUIDs.indexOf(this.UUID)];
let duration = Math.round(sponsorTime[1] - v.currentTime);
return Math.max(duration, 4);
};
this.countdownTime = this.maxCountdownTime();
this.updateTimerDisplay();
}
reskip() {
reskipSponsorTime(this.UUID);
//change unskip button to a reskip button
let unskipButton = document.getElementById("sponsorSkipUnskipButton" + this.idSuffix);
unskipButton.innerText = chrome.i18n.getMessage("unskip");
unskipButton.removeEventListener("click", this.unskipCallback);
//setup new callback
this.unskipCallback = this.unskip.bind(this);
unskipButton.addEventListener("click", this.unskipCallback);
//reset duration
this.maxCountdownTime = () => 4;
this.countdownTime = this.maxCountdownTime();
this.updateTimerDisplay();
}
afterDownvote() {
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
this.addNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
//remove this sponsor from the sponsors looked up
//find which one it is
for (let i = 0; i < sponsorTimes.length; i++) {
if (UUIDs[i] == this.UUID) {
//this one is the one to hide
//add this as a hidden sponsorTime
hiddenSponsorTimes.push(i);
let sponsorTimesLeft = sponsorTimes.slice();
for (let j = 0; j < hiddenSponsorTimes.length; j++) {
//remove this sponsor time
sponsorTimesLeft.splice(hiddenSponsorTimes[j], 1);
}
//update the preview
previewBar.set(sponsorTimesLeft, [], v.duration);
break;
}
}
}
addNoticeInfoMessage(message) {
let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + this.idSuffix);
if (previousInfoMessage != null) {
//remove it
document.getElementById("sponsorSkipNotice" + this.idSuffix).removeChild(previousInfoMessage);
}
//add info
let thanksForVotingText = document.createElement("p");
thanksForVotingText.id = "sponsorTimesInfoMessage" + this.idSuffix;
thanksForVotingText.className = "sponsorTimesInfoMessage";
thanksForVotingText.innerText = message;
//add element to div
document.getElementById("sponsorSkipNotice" + this.idSuffix).insertBefore(thanksForVotingText, document.getElementById("sponsorSkipNoticeSpacer" + this.idSuffix));
}
resetNoticeInfoMessage() {
let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + this.idSuffix);
if (previousInfoMessage != null) {
//remove it
document.getElementById("sponsorSkipNotice" + this.idSuffix).removeChild(previousInfoMessage);
}
}
addVoteButtonInfo(message) {
this.resetVoteButtonInfo();
//hide report button and text for it
let downvoteButton = document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix);
if (downvoteButton != null) {
downvoteButton.style.display = "none";
}
let downvoteButtonText = document.getElementById("sponsorTimesReportText" + this.idSuffix);
if (downvoteButtonText != null) {
downvoteButtonText.style.display = "none";
}
//add info
let thanksForVotingText = document.createElement("td");
thanksForVotingText.id = "sponsorTimesVoteButtonInfoMessage" + this.idSuffix;
thanksForVotingText.className = "sponsorTimesInfoMessage sponsorTimesVoteButtonMessage";
thanksForVotingText.innerText = message;
//add element to div
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).prepend(thanksForVotingText);
}
resetVoteButtonInfo() {
let previousInfoMessage = document.getElementById("sponsorTimesVoteButtonInfoMessage" + this.idSuffix);
if (previousInfoMessage != null) {
//remove it
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).removeChild(previousInfoMessage);
}
//show button again
document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix).style.removeProperty("display");
}
//close this notice
close() {
let notice = document.getElementById("sponsorSkipNotice" + this.idSuffix);
if (notice != null) {
notice.remove();
}
//remove setInterval
if (this.countdownInterval != -1) clearInterval(this.countdownInterval);
}
}