mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-06 11:37:02 +03:00
Compare commits
159 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44516648a1 | ||
|
|
fbeabc830b | ||
|
|
f370746382 | ||
|
|
e82beb861a | ||
|
|
1791d31681 | ||
|
|
784ddea34a | ||
|
|
69c93a0563 | ||
|
|
4e4d50de82 | ||
|
|
25b9edabf8 | ||
|
|
6851470547 | ||
|
|
73c1fc17b3 | ||
|
|
cba5b05c0c | ||
|
|
3f1573f1b3 | ||
|
|
93ffc93943 | ||
|
|
4214af4d56 | ||
|
|
01405dd32e | ||
|
|
047432af03 | ||
|
|
a8bd5d0068 | ||
|
|
eeb6d20e96 | ||
|
|
8bb8511bf4 | ||
|
|
563610cbcd | ||
|
|
04190b27d8 | ||
|
|
1782376e3d | ||
|
|
ef1b96bbf1 | ||
|
|
7deea5d648 | ||
|
|
c6460b006f | ||
|
|
4352667b1c | ||
|
|
a84502dc92 | ||
|
|
d7c67fb481 | ||
|
|
adc9748d4d | ||
|
|
f310c53f88 | ||
|
|
f2c2fd0d29 | ||
|
|
1b0cd0f485 | ||
|
|
48f6f2f66c | ||
|
|
85b70f8ad7 | ||
|
|
3e32f28d2e | ||
|
|
9bd1b03504 | ||
|
|
cdccc43b31 | ||
|
|
21ce614bd9 | ||
|
|
7f56ec238f | ||
|
|
e1625437d4 | ||
|
|
5b9afebd4e | ||
|
|
93afc06717 | ||
|
|
cfbf1f8995 | ||
|
|
516e5077a9 | ||
|
|
0c2ceb134b | ||
|
|
02bcb0b213 | ||
|
|
35c6ed81b5 | ||
|
|
a229aee2cc | ||
|
|
f91c6d5f9d | ||
|
|
0e93fb6f57 | ||
|
|
1f491d2031 | ||
|
|
32dd7d43d7 | ||
|
|
284efe9902 | ||
|
|
4e795c8fb1 | ||
|
|
c83eb589ea | ||
|
|
7cd6b324b9 | ||
|
|
5891fccacb | ||
|
|
59233f3307 | ||
|
|
796466a72a | ||
|
|
3f35642010 | ||
|
|
5bbfcf742d | ||
|
|
aaf79fda0d | ||
|
|
8604788d27 | ||
|
|
519a822751 | ||
|
|
fef31c399b | ||
|
|
5802e05228 | ||
|
|
da21081a12 | ||
|
|
6d739de57c | ||
|
|
edcd328743 | ||
|
|
5c9e6cac0e | ||
|
|
7ab5e2cf52 | ||
|
|
42dcdb40cf | ||
|
|
896357a943 | ||
|
|
2d96c24b13 | ||
|
|
1753f58120 | ||
|
|
7244ca8f5e | ||
|
|
ec0c989066 | ||
|
|
c801b1fecd | ||
|
|
57b50106d1 | ||
|
|
871ba63f67 | ||
|
|
f0888faf78 | ||
|
|
23fbbebc9e | ||
|
|
9951a19478 | ||
|
|
dd4ab2f38a | ||
|
|
6bcdb3e272 | ||
|
|
227bec4d8e | ||
|
|
556b4f88d2 | ||
|
|
2d12f957bc | ||
|
|
c1efe02614 | ||
|
|
f0e1979aab | ||
|
|
989db6d6b6 | ||
|
|
781096c290 | ||
|
|
536c6e3e41 | ||
|
|
de376176db | ||
|
|
e63389cfa3 | ||
|
|
1c4ca8da26 | ||
|
|
dcbd7ba4cd | ||
|
|
9fc8d385ab | ||
|
|
07e878e065 | ||
|
|
a2af4dba52 | ||
|
|
2fbafb6b10 | ||
|
|
98eb72ef1f | ||
|
|
89d127c5c5 | ||
|
|
a784c8a850 | ||
|
|
a533aaf5cf | ||
|
|
434b5bdbad | ||
|
|
d1f1f9213e | ||
|
|
d498c107a8 | ||
|
|
f12b44762e | ||
|
|
fc4da038e9 | ||
|
|
d5999ad330 | ||
|
|
146ece3bff | ||
|
|
92095acf36 | ||
|
|
279c10d555 | ||
|
|
0ae3820681 | ||
|
|
283e4d053e | ||
|
|
6dbb2f9d10 | ||
|
|
c657bb763b | ||
|
|
259cdb1abe | ||
|
|
86e96e59af | ||
|
|
9ba30dbafa | ||
|
|
2907db705c | ||
|
|
a6a0f917e0 | ||
|
|
bcdba798d9 | ||
|
|
32884372fa | ||
|
|
9b2364cfb7 | ||
|
|
c1aebf45c8 | ||
|
|
6e0c6332cc | ||
|
|
47d0d340d4 | ||
|
|
118804e139 | ||
|
|
0bef50e259 | ||
|
|
bfb876af8b | ||
|
|
84d5d3124c | ||
|
|
825d997d6d | ||
|
|
8e9e5bfddb | ||
|
|
05765682a5 | ||
|
|
2b5d56942a | ||
|
|
f097ff60aa | ||
|
|
655691a28f | ||
|
|
7ddef8d519 | ||
|
|
2fb79f0066 | ||
|
|
655d87ce0f | ||
|
|
ed7c98afa8 | ||
|
|
41bf0c9697 | ||
|
|
5eb0132660 | ||
|
|
c43695e596 | ||
|
|
9aeda25136 | ||
|
|
90e671ebf8 | ||
|
|
3ecc180d06 | ||
|
|
7ac9ec37ef | ||
|
|
e176a9f241 | ||
|
|
91bd910c40 | ||
|
|
a6c77185de | ||
|
|
b871d721db | ||
|
|
85f9bb1d34 | ||
|
|
adb60c6357 | ||
|
|
4db6593681 | ||
|
|
d75a7ca897 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
config.js
|
||||
ignored
|
||||
ignored
|
||||
.idea/
|
||||
39
README.md
39
README.md
@@ -1,23 +1,38 @@
|
||||

|
||||
<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>
|
||||
|
||||
<h1 align="center">SponsorBlock</h1>
|
||||
|
||||
<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>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://addons.mozilla.org/addon/sponsorblock/?src=external-github"><img src="https://img.shields.io/amo/users/sponsorblock?label=Firefox%20Users" alt="Badge"></img></a>
|
||||
<a href="https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone"><img src="https://img.shields.io/chrome-web-store/users/mnjggcdmjocbbbhaepdhchncahnbgone?label=Chome%20Users" alt="Badge"></img></a>
|
||||
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Sponsors%20Submitted&query=totalSubmissions&suffix=%20sponsors&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetTotalStats&color=darkred" alt="Badge"></img></a>
|
||||
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Contributing%20Users&query=userCount&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetTotalStats&color=darkblue" alt="Badge"></img></a>
|
||||
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Time%20Saved%20From%20Skips&query=daysSaved&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetDaysSavedFormatted&color=darkgreen&suffix=%20days" alt="Badge"></img></a>
|
||||
</p>
|
||||
|
||||
|
||||
# SponsorBlock
|
||||
|
||||
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.
|
||||
|
||||
# Available for Chrome and Firefox
|
||||
|
||||
Chrome: https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone
|
||||
|
||||
Firefox: https://addons.mozilla.org/addon/sponsorblock/
|
||||
|
||||
# Server
|
||||
|
||||
The backend server code is available here: https://github.com/ajayyy/SponsorBlockServer
|
||||
|
||||
It is a simple Sqlite database that will hold all the timing data.
|
||||
|
||||
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database.db. So, you can download a backup or get archive.org to take a backup if you do desire.
|
||||
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database.db. So, you can download a backup or get archive.org to take a backup for you if you want.
|
||||
|
||||
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.
|
||||
|
||||
@@ -25,10 +40,6 @@ Hopefully this project can be combined with projects like [this](https://github.
|
||||
|
||||
You can read the API docs [here](https://github.com/ajayyy/SponsorBlockServer#api-docs).
|
||||
|
||||
# Previous extension
|
||||
|
||||
This project is partially based off of [this experimental extension](https://github.com/OfficialNoob/YTSponsorSkip), which has the basic video skipping functionality.
|
||||
|
||||
# Build Yourself
|
||||
|
||||
You can load this project as an unpacked extension. Make sure to rename the `config.js.example` file to `config.js` before installing.
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
"message": "Channel Whitelisted!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "Sponsor"
|
||||
"message": "sponsor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "Sponsors"
|
||||
"message": "sponsors"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "sponsor segment"
|
||||
@@ -87,7 +87,6 @@
|
||||
"Unknown": {
|
||||
"message": "There was an error submitting your sponsor times, please try again later."
|
||||
},
|
||||
|
||||
"sponsorFound": {
|
||||
"message": "This video's sponsors are in the database!"
|
||||
},
|
||||
@@ -123,5 +122,145 @@
|
||||
},
|
||||
"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?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Whitelist Channel"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Remove Channel From Whitelist"
|
||||
},
|
||||
"whitelistDescription": {
|
||||
"message": "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."
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Vote On A Sponsor Time"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Record the times of a sponsorship"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "So far, you've submitted"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "You have saved people from "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "View the leaderboard"
|
||||
},
|
||||
"here": {
|
||||
"message": "here"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Click the button below when the sponsorship starts and ends to record and\nsubmit it to the database."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Hint: Press the semicolon key while focused on a video report the start/end of a sponsor and quote to submit. (This can be changed in the options)"
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Latest Sponsor Message Times Chosen"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Clear Times"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Submit Times"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "This is used on the public stats page to show off how much you've contributed. See it"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Set Username"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Come join the official discord server to give suggestions and feedback!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Hide this"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Options"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Hide Buttons On YouTube Player"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Show Buttons On YouTube Player"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "This hides the buttons that appear on the YouTube player to submit sponsors. I can see this being annoying for some\n people. Instead of using the button there, this popup can be used to submit sponsors. To hide the notice that appears, \n use the button that appears on the notice saying \"Don't show this again\". You can always enable these settings again later."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Show Info Button On YouTube Player"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Hide Info Button On YouTube Player"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "This is the button that opens up a popup in the YouTube page."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Hide Delete Button On YouTube Player"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Show Delete Button On YouTube Player"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "This is the button that allows you to clear all sponsors on the YouTube player."
|
||||
},
|
||||
"disableViewTracking": {
|
||||
"message": "Disable Sponsor View Tracking"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Enable Sponsor View Tracking"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "This feature tracks which sponsors you have skipped to let users know how much their submission has helped others and\nused as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message\nto the server each time you skip a sponsor. Hopefully most people don't change this setting so that the view numbers are accurate. :)"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Show Notice Again"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "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.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "Website",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Source Code",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "The notice has been upgraded!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "If you still don't like it, hit the never show button.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Set key for start sponsor keybind"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Set key for submission keybind"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Select a key by typing it"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "The keybind has been set to: "
|
||||
}
|
||||
}
|
||||
|
||||
129
_locales/fr/messages.json
Normal file
129
_locales/fr/messages.json
Normal 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) ?"
|
||||
}
|
||||
}
|
||||
247
_locales/it/messages.json
Normal file
247
_locales/it/messages.json
Normal file
@@ -0,0 +1,247 @@
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "SponsorBlock per YouTube - Salta gli sponsor",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
|
||||
"Description": {
|
||||
"message": "Salta i contenuti sponsorizzati nei video di YouTube. Segnala gli annunci incorporati nei video che guardi per far risparmiare tempo agli altri.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"helpPage": {
|
||||
"message": "index_en.html"
|
||||
},
|
||||
"400": {
|
||||
"message": "Richiesta non valida"
|
||||
},
|
||||
"429": {
|
||||
"message": "Stai inviando troppi spezzoni per questo video, sei sicuro che ce ne siano così tanti?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Questo spezzone è già stato inviato"
|
||||
},
|
||||
"502": {
|
||||
"message": "Sembra che il server non funzioni. Contatta lo sviluppatore."
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Canale aggiunto alla whitelist!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "sponsorizzazione"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponsorizzazioni"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "spezzone sponsorizzato"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "spezzoni sponsorizzati"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponsorizzazione Saltata"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Segnala"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Segnala questo spezzone come non corretto."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Chiudi"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Caricamento..."
|
||||
},
|
||||
"Mins": {
|
||||
"message": "Minuti"
|
||||
},
|
||||
"Secs": {
|
||||
"message": "Secondi"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Non mostrare più"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Premi non saltare per tornare da dove sei venuto."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Non saltare"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Salta ancora"
|
||||
},
|
||||
"paused": {
|
||||
"message": "In pausa"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "\n\nPer modificare o eliminare valori specifici, premi il pulsante delle informazioni o apri il popup cliccando l'icona dell'estensione nell'angolo in alto a destra."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Sei sicuro di volerlo cancellare?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Si è verificato un errore durante l'invio dello spezzone sponsorizzato, per favore riprova più tardi."
|
||||
},
|
||||
|
||||
"sponsorFound": {
|
||||
"message": "I contenuti sponsorizzati di questo video sono nel database!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Nessuna sponsorizzazione trovata"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "La sponsorizzazione inizia adesso"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "La sponsorizzazione finisce adesso"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Probabilmente questa non è una scheda di YouTube, oppure hai cliccato troppo presto. \nSe sei sicuro di essere in una scheda di YouTube,\n riapri questo popup."
|
||||
},
|
||||
"success": {
|
||||
"message": "Successo!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Votato!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Hai già votato."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Sembra che il server non funzioni. Contatta subito lo sviluppatore."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Si è verificato un errore durante la connessione. Codice errore: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Vuoi inviare gli spezzoni sponsorizzati per il video con id"
|
||||
},
|
||||
"leftTimes": {
|
||||
"message": "Sembra che tu non abbia inviato alcuni spezzoni sponsorizzati. Ritorna alla pagina precedente per inviarli (non sono stati eliminati)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Cancella gli Spezzoni Sponsorizzati"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Apri il Popup di SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Invia gli Spezzoni Sponsorizzati"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Sei sicuro di volerlo inviare?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Aggiungi Canale alla Whitelist"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Rimuovi Canale dalla Whitelist"
|
||||
},
|
||||
"whitelistDescription": {
|
||||
"message": "Aggiungi alla whitelist i canali che sponsorizzano eticamente per incoraggiare ad un comportamento corretto, oppure se sono semplicemente intrattenenti e divertenti. Oppure non farlo, decidi tu."
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Vota uno Spezzone Sponsorizzato"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Registra uno Spezzone Sponsorizzato"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "Fino ad ora hai inviato"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Hai salvato le persone da "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Guarda la classifica"
|
||||
},
|
||||
"here": {
|
||||
"message": "qui"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Premi il pulsante qui sotto quando inizia e finisce la sponsorizzazione per registrarla e\ninviarla al database."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Suggerimento: Premi il tasto punto e virgola mentre il video è attivo per segnalare l'inizio/fine di una sponsorizzazione e virgolette per inviare."
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Ultimi minutaggi sponsorizzati scelti"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Cancella Minutaggi"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Invia Minutaggi"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Viene utilizzato nelle pagine delle statistiche pubbliche che mostrano quanto hai contribuito. Vedi"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Imposta Username"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Entra nel server Discord ufficiale per darci suggerimenti e feedback!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Nascondi"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Opzioni"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Nascondi i Pulsanti nel Lettore di YouTube"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Mostra i Pulsanti nel Lettore di YouTube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Nasconde i pulsanti che appaiono nel lettore di YouTube per inviare spezzoni sponsorizzati. Capisco che può essere fastidioso per alcune\n persone. Invece di utilizzare quei pulsanti, è possibile utilizzare questo popup per inviare gli spezzoni sponsorizzati. Per nascondere l'avviso che appare, \nusa il bottone \"Non mostrare più\" nell'avviso. Potrai sempre abilitare nuovamente queste impostazioni in futuro."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Mostra il Pulsante Informazioni nel Lettore di YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Nascondi il Pulsante Informazioni nel Lettore di YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Questo è il pulsante che apre un popup nella pagina YouTube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Nascondi il Pulsante Elimina nel Lettore di YouTube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Mostra il Pulsante Elimina nel Lettore di YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Questo è il pulsante che ti permette di cancellare tutti gli spezzoni sponsorizzati nel lettore di YouTube."
|
||||
},
|
||||
"disableViewTracking": {
|
||||
"message": "Disattiva il Monitoraggio delle Sponsorizzazioni"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Disattiva il Monitoraggio delle Sponsorizzazioni"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Questa funzione tiene traccia di quali sponsorizzazioni hai saltato per far sapere agli utenti quanto è stato d'aiuto agli altri il loro contributo e\nviene utilizzato come metrica assieme ai voti positivi per filtrare lo spam dal database. L'estensione invia un messaggio\nal server ogni volta che salti una sponsorizzazione. Si spera che la maggior parte delle persone non modifichi questa impostazione così i numeri sono accurati. :)"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Mostra di Nuovo l'Avviso"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock è un'estensione che salta gli spezzoni con contenuti sponsorizzati nei video di YouTube. SponsorBlock è un'estensione crowdsourced per i browser che permette a chiunque di inviare i minutaggi degli spezzoni sponsorizzati nei video di YouTube. Quando una persona avrà inviato questa informazione, tutti gli utenti che utilizzano questa estensione potranno saltare lo spezzone sponsorizzato.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "Sito Web",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Codice Sorgente",
|
||||
"description": "Used on Firefox Store Page"
|
||||
}
|
||||
}
|
||||
247
_locales/pt_BR/messages.json
Normal file
247
_locales/pt_BR/messages.json
Normal file
@@ -0,0 +1,247 @@
|
||||
{
|
||||
"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 à lista branca!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "patrocinador"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "patrocinadores"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmento de patrocinador"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "segmentos 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 feche esse popup e abra 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ê se esqueceu de enviar alguns segmentos. Volta pra página para os enviar (não foram deletados)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Apagar intervalos dos patrocínios"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Abrir o Popup SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Submeter intervalos dos patrocínios"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Tem a certeza que pretende submeter?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Meter canal na Whitelist"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Remover canal da Whitelist"
|
||||
},
|
||||
"whitelistDescription": {
|
||||
"message": "Colocar na Whitelist canais com patrocínios éticos que encoragem boas atitude, ou simplesmente canais com patrocínios engraçados. Ou não, é consigo."
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Vote num intervalo de patrocínio"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Registe um intervalo de patrocínio"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "Até agora submeteu"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Poupaste a outros de "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Ver a leaderboard"
|
||||
},
|
||||
"here": {
|
||||
"message": "aqui"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Carregue neste botão abaixo quando o patrocínio começar e quando\n acabar para registar e submetê-lo à base de dados"
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Dica: Carregue na tecla ; enquanto num vídeo para registar o começo/fim de um patrocínio e \" para submeter"
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Intervalos de Patrocínios Escolhidos mais Recentemente"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Limpar Intervalos"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Submeter Intervalos"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Isto é usado na página pública de estatísticas que mostra o quanto já contríbuíu. Veje-a"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Criar nomde de utilizador"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Esconder isto"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Opções"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Esconder botões no player do Youtube"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Mostrar botões no player do Youtube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Isto esconde os botões que aparecem no player do Youtube para submeter patrocínios. Entendemos que possa ser\n incómodo a algumas pessoas. Em vez de usar esses botões pode usar os do popup. Para esconder a mensagem que aparece, \n ususe o botão na mesma que diz \"Don't show this again\". Pode sempre reactivar estas definições novamente."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Mostrar botão de Informações no player do Youtube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Esconder botão de Informações no player do Youtube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Este é o botão que abre o popup na pagina do Youtube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Esconder botão de Apagar no player do Youtube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Mostrar botão de Apagar no player do Youtube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
|
||||
},
|
||||
"disableViewTracking": {
|
||||
"message": "Desactivar registo de visualização de patrocínios"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Activar registo de visualização de patrocínios"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Esta funcionalidade regista que patrocínios tem saltado para que outros utilizadores saibam o quanto as suas submições têm ajudado outros\n e é usado como métrica de votos para evitar spam na base de dados. A extenção \n envia uma notificação ao servidor sempre que salta um patrocínio. Quanto menos pessoas desactivarem esta funcionalidade mais precisas serão as estimativas :)"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Mostrar notificação outra vez"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock é uma extensão que salta segmentos patrocinados em vídeos do YouTube. SponsorBlock é uma extenção crowdfunded que permite a qualquer um submeter o início e o fim de segmentos patrocinados. Assim que uma pessoa submete essa informação todos com a extenção poderam saltar automaticamete o patrocínio.",
|
||||
"description": "Descrição completa da extençao nas lojas dos browsers."
|
||||
},
|
||||
"website": {
|
||||
"message": "Site",
|
||||
"description": "Usado na pagina da loja do Firefox"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Código fonte",
|
||||
"description": "Usado na pagina da loja do Firefox"
|
||||
}
|
||||
}
|
||||
246
_locales/pt_pt/messages.json
Normal file
246
_locales/pt_pt/messages.json
Normal file
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Nome da extensão."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "SponsorBlock para o YouTube - Salte patrocínios",
|
||||
"description": "Nome da extensão."
|
||||
},
|
||||
|
||||
"Description": {
|
||||
"message": "Salte patrocinadores em vídeos do YouTube. Reporte patrocinadores em vídeos que assista para poupar tempo a outros.",
|
||||
"description": "Descrição da extensão."
|
||||
},
|
||||
"helpPage": {
|
||||
"message": "index_en.html"
|
||||
},
|
||||
"400": {
|
||||
"message": "O servidor disse que este pedido foi inválido"
|
||||
},
|
||||
"429": {
|
||||
"message": "Enviou muitos segmentos para este vídeo, tem certeza que tem assim tantos?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Isso já foi enviado antes"
|
||||
},
|
||||
"502": {
|
||||
"message": "Parece que o servidor caiu. Contacte o desenvolvedor para o informar."
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Canal adicionado à whitelist!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "patrocinador"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "patrocinadores"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmento de patrocínio"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "segmentos de patrocínio"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Patrocínio saltado"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Reportar"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Reportar subimissão como inválida."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Ignorar"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "A carregar..."
|
||||
},
|
||||
"Mins": {
|
||||
"message": "Minutos"
|
||||
},
|
||||
"Secs": {
|
||||
"message": "Segundos"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Nunca mostrar"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Carregue em reverter salto para voltar a onde estava"
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Reverter salto"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Saltar novamente"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pausado"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "\n\nPara editar ou remover linhas individuais, carregue com o botão direito ou abra o popup da extensão pelo icone no canto superior direito."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Tem certeza que deseja limpar isto?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Erro ao enviar os seus segmentos, tente novamente mais tarde."
|
||||
},
|
||||
"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": "Isto provavelmente não é uma tab do YouTube, ou pode ter clicado muito cedo. \n Se sabe que é uma tab do YouTube,\n feche este popup e abra de novo."
|
||||
},
|
||||
"success": {
|
||||
"message": "Sucesso!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Votado!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Já votou antes."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Parece que o servidor caiu. Contacte o desenvolvedor o quanto antes."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Deu-se um erro de conecção: Código: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Quer enviar os segmentos para o vídeo de ID"
|
||||
},
|
||||
"leftTimes": {
|
||||
"message": "Parece que se esqueceu de enviar alguns segmentos. Retorne à página para os enviar (não foram apagados)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Apagar intervalos dos patrocínios"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Abrir o Popup SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Submeter intervalos dos patrocínios"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Tem a certeza que pretende submeter?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Meter canal na Whitelist"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Remover canal da Whitelist"
|
||||
},
|
||||
"whitelistDescription": {
|
||||
"message": "Colocar na Whitelist canais com patrocínios éticos que encoragem boas atitude, ou simplesmente canais com patrocínios engraçados. Ou não, é consigo."
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Vote num intervalo de patrocínio"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Registe um intervalo de patrocínio"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "Até agora submeteu"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Poupaste a outros de "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Ver a leaderboard"
|
||||
},
|
||||
"here": {
|
||||
"message": "aqui"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Carregue neste botão abaixo quando o patrocínio começar e quando\n acabar para registar e submetê-lo à base de dados"
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Dica: Carregue na tecla ; enquanto num vídeo para registar o começo/fim de um patrocínio e \" para submeter"
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Intervalos de Patrocínios Escolhidos mais Recentemente"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Limpar Intervalos"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Submeter Intervalos"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Isto é usado na página pública de estatísticas que mostra o quanto já contríbuíu. Veje-a"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Criar nomde de utilizador"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Esconder isto"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Opções"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Esconder botões no player do Youtube"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Mostrar botões no player do Youtube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Isto esconde os botões que aparecem no player do Youtube para submeter patrocínios. Entendemos que possa ser\n incómodo a algumas pessoas. Em vez de usar esses botões pode usar os do popup. Para esconder a mensagem que aparece, \n ususe o botão na mesma que diz \"Don't show this again\". Pode sempre reactivar estas definições novamente."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Mostrar botão de Informações no player do Youtube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Esconder botão de Informações no player do Youtube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Este é o botão que abre o popup na pagina do Youtube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Esconder botão de Apagar no player do Youtube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Mostrar botão de Apagar no player do Youtube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
|
||||
},
|
||||
"disableViewTracking": {
|
||||
"message": "Desactivar registo de visualização de patrocínios"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Activar registo de visualização de patrocínios"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Esta funcionalidade regista que patrocínios tem saltado para que outros utilizadores saibam o quanto as suas submições têm ajudado outros\n e é usado como métrica de votos para evitar spam na base de dados. A extenção \n envia uma notificação ao servidor sempre que salta um patrocínio. Quanto menos pessoas desactivarem esta funcionalidade mais precisas serão as estimativas :)"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Mostrar notificação outra vez"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock é uma extensão que salta segmentos patrocinados em vídeos do YouTube. SponsorBlock é uma extenção crowdfunded que permite a qualquer um submeter o início e o fim de segmentos patrocinados. Assim que uma pessoa submete essa informação todos com a extenção poderam saltar automaticamete o patrocínio.",
|
||||
"description": "Descrição completa da extençao nas lojas dos browsers."
|
||||
},
|
||||
"website": {
|
||||
"message": "Site",
|
||||
"description": "Usado na pagina da loja do Firefox"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Código fonte",
|
||||
"description": "Usado na pagina da loja do Firefox"
|
||||
}
|
||||
}
|
||||
130
_locales/ru/messages.json
Normal file
130
_locales/ru/messages.json
Normal 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": "Вы уверены, что хотите отправить эту информацию?"
|
||||
}
|
||||
}
|
||||
108
background.js
108
background.js
@@ -1,40 +1,40 @@
|
||||
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
|
||||
chrome.tabs.onUpdated.addListener(function(tabId) {
|
||||
chrome.tabs.sendMessage(tabId, {
|
||||
message: 'update',
|
||||
});
|
||||
message: 'update',
|
||||
}, () => void chrome.runtime.lastError ); // Suppress error on Firefox
|
||||
});
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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: "Do you want to submit the sponsor times for video id " + request.previousVideoID + "?",
|
||||
message: "You seem to have left some sponsor times unsubmitted. Go back to that page to submit them (they are not deleted).",
|
||||
title: chrome.i18n.getMessage("wantToSubmit") + request.previousVideoID + "?",
|
||||
message: chrome.i18n.getMessage("leftTimes"),
|
||||
iconUrl: "./icons/LogoSponsorBlocker256px.png"
|
||||
});
|
||||
}
|
||||
@@ -42,38 +42,19 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
|
||||
//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");
|
||||
}
|
||||
//open up the install page
|
||||
chrome.tabs.create({url: chrome.extension.getURL("/help/"+chrome.i18n.getMessage("helpPage"))});
|
||||
|
||||
//generate a userID
|
||||
const newUserID = generateUUID();
|
||||
const newUserID = generateUserID();
|
||||
//save this UUID
|
||||
chrome.storage.sync.set({
|
||||
"userID": newUserID,
|
||||
//the last video id loaded, to make sure it is a video id change
|
||||
"sponsorVideoID": null,
|
||||
"previousVideoID": null
|
||||
"userID": newUserID
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -117,6 +98,14 @@ function submitVote(type, UUID, callback) {
|
||||
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) {
|
||||
@@ -143,11 +132,29 @@ function submitVote(type, UUID, callback) {
|
||||
function submitTimes(videoID, callback) {
|
||||
//get the video times from storage
|
||||
let sponsorTimeKey = 'sponsorTimes' + videoID;
|
||||
chrome.storage.sync.get([sponsorTimeKey, "userID"], function(result) {
|
||||
chrome.storage.sync.get([sponsorTimeKey, "userID"], async function(result) {
|
||||
let sponsorTimes = result[sponsorTimeKey];
|
||||
let userID = result.userID;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
//submit these times
|
||||
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||
//submit the sponsorTime
|
||||
@@ -201,10 +208,9 @@ function sendRequestToServer(type, address, callback) {
|
||||
xmlhttp.send();
|
||||
}
|
||||
|
||||
function generateUUID(length = 36) {
|
||||
function generateUserID(length = 36) {
|
||||
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
let result = "";
|
||||
let isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
|
||||
if (window.crypto && window.crypto.getRandomValues) {
|
||||
values = new Uint32Array(length);
|
||||
window.crypto.getRandomValues(values);
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
}
|
||||
|
||||
.sponsorSkipNotice {
|
||||
min-width: 280px;
|
||||
min-width: 300px;
|
||||
background-color: rgba(28, 28, 28, 0.9);
|
||||
position: absolute;
|
||||
right: 5px;
|
||||
|
||||
679
content.js
679
content.js
@@ -10,9 +10,6 @@ var sponsorVideoID = null;
|
||||
//these are sponsors that have been downvoted
|
||||
var hiddenSponsorTimes = [];
|
||||
|
||||
//the time this video is starting at when first played, if not zero
|
||||
var youtubeVideoStartTime = null;
|
||||
|
||||
//the video
|
||||
var v;
|
||||
|
||||
@@ -27,15 +24,20 @@ var durationListenerSetUp = false;
|
||||
//the channel this video is about
|
||||
var channelURL;
|
||||
|
||||
//the title of the last video loaded. Used to make sure the channel URL has been updated yet.
|
||||
var title;
|
||||
|
||||
//is this channel whitelised from getting sponsors skipped
|
||||
var channelWhitelisted = false;
|
||||
|
||||
// create preview bar
|
||||
var previewBar;
|
||||
var previewBar = null;
|
||||
|
||||
if (id = getYouTubeVideoID(document.URL)) { // Direct Links
|
||||
videoIDChange(id);
|
||||
}
|
||||
//the player controls on the YouTube player
|
||||
var controls = null;
|
||||
|
||||
// Direct Links
|
||||
videoIDChange(getYouTubeVideoID(document.URL));
|
||||
|
||||
//the last time looked at (used to see if this time is in the interval)
|
||||
var lastTime = -1;
|
||||
@@ -78,126 +80,156 @@ chrome.storage.sync.get(["trackViewCount"], function(result) {
|
||||
|
||||
//if the notice should not be shown
|
||||
//happens when the user click's the "Don't show notice again" button
|
||||
//option renamed when new notice was made
|
||||
var dontShowNotice = false;
|
||||
chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) {
|
||||
chrome.storage.sync.get(["dontShowNotice"], function(result) {
|
||||
let dontShowNoticeAgain = result.dontShowNoticeAgain;
|
||||
if (dontShowNoticeAgain != undefined) {
|
||||
dontShowNotice = dontShowNoticeAgain;
|
||||
}
|
||||
});
|
||||
//load the legacy option to hide the notice
|
||||
var dontShowNoticeOld = false;
|
||||
chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) {
|
||||
let dontShowNoticeAgain = result.dontShowNoticeAgain;
|
||||
if (dontShowNoticeAgain != undefined) {
|
||||
dontShowNoticeOld = dontShowNoticeAgain;
|
||||
}
|
||||
});
|
||||
|
||||
//get messages from the background script and the popup
|
||||
chrome.runtime.onMessage.addListener(messageListener);
|
||||
|
||||
function messageListener(request, sender, sendResponse) {
|
||||
//messages from popup script
|
||||
|
||||
if (request.message == "update") {
|
||||
if(id = getYouTubeVideoID(document.URL)){
|
||||
videoIDChange(id);
|
||||
} else {
|
||||
resetValues();
|
||||
}
|
||||
}
|
||||
|
||||
if (request.message == "sponsorStart") {
|
||||
sponsorMessageStarted(sendResponse);
|
||||
}
|
||||
switch(request.message){
|
||||
case "update":
|
||||
videoIDChange(getYouTubeVideoID(document.URL));
|
||||
|
||||
if (request.message == "sponsorDataChanged") {
|
||||
updateSponsorTimesSubmitting();
|
||||
}
|
||||
break;
|
||||
case "sponsorStart":
|
||||
sponsorMessageStarted(sendResponse);
|
||||
|
||||
if (request.message == "isInfoFound") {
|
||||
//send the sponsor times along with if it's found
|
||||
sendResponse({
|
||||
found: sponsorDataFound,
|
||||
sponsorTimes: sponsorTimes,
|
||||
hiddenSponsorTimes: hiddenSponsorTimes,
|
||||
UUIDs: UUIDs
|
||||
});
|
||||
break;
|
||||
case "sponsorDataChanged":
|
||||
updateSponsorTimesSubmitting();
|
||||
|
||||
if (popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||
//the popup should be closed now that another is opening
|
||||
closeInfoMenu();
|
||||
}
|
||||
break;
|
||||
case "isInfoFound":
|
||||
//send the sponsor times along with if it's found
|
||||
sendResponse({
|
||||
found: sponsorDataFound,
|
||||
sponsorTimes: sponsorTimes,
|
||||
hiddenSponsorTimes: hiddenSponsorTimes,
|
||||
UUIDs: UUIDs
|
||||
});
|
||||
|
||||
popupInitialised = true;
|
||||
}
|
||||
if (popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||
//the popup should be closed now that another is opening
|
||||
closeInfoMenu();
|
||||
}
|
||||
|
||||
if (request.message == "getVideoID") {
|
||||
sendResponse({
|
||||
videoID: getYouTubeVideoID(document.URL)
|
||||
})
|
||||
}
|
||||
popupInitialised = true;
|
||||
break;
|
||||
case "getVideoID":
|
||||
sendResponse({
|
||||
videoID: sponsorVideoID
|
||||
});
|
||||
|
||||
if (request.message == "skipToTime") {
|
||||
v.currentTime = request.time;
|
||||
}
|
||||
break;
|
||||
case "getVideoDuration":
|
||||
sendResponse({
|
||||
duration: v.duration
|
||||
});
|
||||
|
||||
if (request.message == "getCurrentTime") {
|
||||
sendResponse({
|
||||
currentTime: v.currentTime
|
||||
});
|
||||
}
|
||||
break;
|
||||
case "skipToTime":
|
||||
v.currentTime = request.time;
|
||||
return
|
||||
case "getCurrentTime":
|
||||
sendResponse({
|
||||
currentTime: v.currentTime
|
||||
});
|
||||
|
||||
if (request.message == "getChannelURL") {
|
||||
sendResponse({
|
||||
break;
|
||||
case "getChannelURL":
|
||||
sendResponse({
|
||||
channelURL: channelURL
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
if (request.message == "isChannelWhitelisted") {
|
||||
sendResponse({
|
||||
value: channelWhitelisted
|
||||
})
|
||||
}
|
||||
break;
|
||||
case "isChannelWhitelisted":
|
||||
sendResponse({
|
||||
value: channelWhitelisted
|
||||
});
|
||||
|
||||
if (request.message == "whitelistChange") {
|
||||
channelWhitelisted = request.value;
|
||||
sponsorsLookup(getYouTubeVideoID(document.URL));
|
||||
}
|
||||
break;
|
||||
case "whitelistChange":
|
||||
channelWhitelisted = request.value;
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
|
||||
if (request.message == "showNoticeAgain") {
|
||||
dontShowNotice = false;
|
||||
}
|
||||
break;
|
||||
case "dontShowNotice":
|
||||
dontShowNotice = false;
|
||||
|
||||
if (request.message == "changeStartSponsorButton") {
|
||||
changeStartSponsorButton(request.showStartSponsor, request.uploadButtonVisible);
|
||||
}
|
||||
break;
|
||||
case "changeStartSponsorButton":
|
||||
changeStartSponsorButton(request.showStartSponsor, request.uploadButtonVisible);
|
||||
|
||||
if (request.message == "changeVideoPlayerControlsVisibility") {
|
||||
hideVideoPlayerControls = request.value;
|
||||
break;
|
||||
case "showNoticeAgain":
|
||||
dontShowNotice = false;
|
||||
|
||||
break;
|
||||
case "changeVideoPlayerControlsVisibility":
|
||||
hideVideoPlayerControls = request.value;
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
} else if (request.message == "changeInfoButtonPlayerControlsVisibility") {
|
||||
hideInfoButtonPlayerControls = request.value;
|
||||
break;
|
||||
case "changeInfoButtonPlayerControlsVisibility":
|
||||
hideInfoButtonPlayerControls = request.value;
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
} else if (request.message == "changeDeleteButtonPlayerControlsVisibility") {
|
||||
hideDeleteButtonPlayerControls = request.value;
|
||||
break;
|
||||
case "changeDeleteButtonPlayerControlsVisibility":
|
||||
hideDeleteButtonPlayerControls = request.value;
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
}
|
||||
break;
|
||||
case "trackViewCount":
|
||||
trackViewCount = request.value;
|
||||
|
||||
if (request.message == "trackViewCount") {
|
||||
trackViewCount = request.value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//check for hotkey pressed
|
||||
document.onkeydown = function(e){
|
||||
document.onkeydown = async function(e){
|
||||
e = e || window.event;
|
||||
var key = e.which || e.keyCode;
|
||||
var key = e.key;
|
||||
|
||||
let video = document.getElementById("movie_player");
|
||||
|
||||
let startSponsorKey = await new Promise((resolve, reject) => {
|
||||
chrome.storage.sync.get(["startSponsorKeybind"], (result) => resolve(result));
|
||||
});
|
||||
let submitKey = await new Promise((resolve, reject) => {
|
||||
chrome.storage.sync.get(["submitKeybind"], (result) => resolve(result));
|
||||
});
|
||||
|
||||
if (startSponsorKey.startSponsorKeybind === undefined) {
|
||||
startSponsorKey.startSponsorKeybind = ";"
|
||||
}
|
||||
if (submitKey.submitKeybind === undefined) {
|
||||
submitKey.submitKeybind = "'"
|
||||
}
|
||||
|
||||
//is the video in focus, otherwise they could be typing a comment
|
||||
if (document.activeElement === video) {
|
||||
if(key == 186){
|
||||
if(key == startSponsorKey.startSponsorKeybind){
|
||||
//semicolon
|
||||
startSponsorClicked();
|
||||
} else if (key == 222) {
|
||||
} else if (key == submitKey.submitKeybind) {
|
||||
//single quote
|
||||
submitSponsorTimes();
|
||||
}
|
||||
@@ -211,24 +243,39 @@ function resetValues() {
|
||||
//reset sponsor times
|
||||
sponsorTimes = null;
|
||||
UUIDs = null;
|
||||
sponsorVideoID = id;
|
||||
sponsorLookupRetries = 0;
|
||||
|
||||
//empty the preview bar
|
||||
previewBar.set([], [], 0);
|
||||
if (previewBar !== null) {
|
||||
previewBar.set([], [], 0);
|
||||
}
|
||||
|
||||
//reset sponsor data found check
|
||||
sponsorDataFound = false;
|
||||
}
|
||||
|
||||
function videoIDChange(id) {
|
||||
//not a url change
|
||||
if (sponsorVideoID == id) return;
|
||||
//if the id has not changed return
|
||||
if (sponsorVideoID === id) return;
|
||||
|
||||
//set the global videoID
|
||||
sponsorVideoID = id;
|
||||
|
||||
resetValues();
|
||||
|
||||
//id is not valid
|
||||
if (!id) return;
|
||||
|
||||
let channelIDPromise = wait(getChannelID);
|
||||
channelIDPromise.then(() => channelIDPromise.isFulfilled = true).catch(() => channelIDPromise.isRejected = true);
|
||||
|
||||
//setup the preview bar
|
||||
if (previewBar == null) {
|
||||
//create it
|
||||
let progressBar = document.getElementsByClassName("ytp-progress-bar-container")[0] || document.getElementsByClassName("no-model cue-range-markers")[0];
|
||||
previewBar = new PreviewBar(progressBar);
|
||||
wait(getControls).then(result => {
|
||||
let progressBar = document.getElementsByClassName("ytp-progress-bar-container")[0] || document.getElementsByClassName("no-model cue-range-markers")[0];
|
||||
previewBar = new PreviewBar(progressBar);
|
||||
});
|
||||
}
|
||||
|
||||
//warn them if they had unsubmitted times
|
||||
@@ -256,41 +303,40 @@ function videoIDChange(id) {
|
||||
|
||||
//close popup
|
||||
closeInfoMenu();
|
||||
|
||||
resetValues();
|
||||
|
||||
//see if there is a video start time
|
||||
youtubeVideoStartTime = getYouTubeVideoStartTime(document.URL);
|
||||
|
||||
sponsorsLookup(id);
|
||||
|
||||
sponsorsLookup(id, channelIDPromise);
|
||||
|
||||
//make sure everything is properly added
|
||||
updateVisibilityOfPlayerControlsButton(true);
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
|
||||
//reset sponsor times submitting
|
||||
sponsorTimesSubmitting = [];
|
||||
|
||||
//see if the onvideo control image needs to be changed
|
||||
chrome.runtime.sendMessage({
|
||||
message: "getSponsorTimes",
|
||||
videoID: id
|
||||
}, function(response) {
|
||||
if (response != undefined) {
|
||||
let sponsorTimes = response.sponsorTimes;
|
||||
if (sponsorTimes != null && sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length >= 2) {
|
||||
changeStartSponsorButton(true, true);
|
||||
} else if (sponsorTimes != null && sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length < 2) {
|
||||
changeStartSponsorButton(false, true);
|
||||
} else {
|
||||
changeStartSponsorButton(true, false);
|
||||
}
|
||||
|
||||
//see if this data should be saved in the sponsorTimesSubmitting variable
|
||||
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
||||
sponsorTimesSubmitting = sponsorTimes;
|
||||
}
|
||||
}
|
||||
});
|
||||
wait(getControls).then(result => {
|
||||
chrome.runtime.sendMessage({
|
||||
message: "getSponsorTimes",
|
||||
videoID: id
|
||||
}, function(response) {
|
||||
if (response != undefined) {
|
||||
let sponsorTimes = response.sponsorTimes;
|
||||
if (sponsorTimes != null && sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length >= 2) {
|
||||
changeStartSponsorButton(true, true);
|
||||
} else if (sponsorTimes != null && sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length < 2) {
|
||||
changeStartSponsorButton(false, true);
|
||||
} else {
|
||||
changeStartSponsorButton(true, false);
|
||||
}
|
||||
|
||||
//see if this data should be saved in the sponsorTimesSubmitting variable
|
||||
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
||||
sponsorTimesSubmitting = sponsorTimes;
|
||||
|
||||
updatePreviewBar();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//see if video controls buttons should be added
|
||||
chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) {
|
||||
@@ -317,7 +363,7 @@ function videoIDChange(id) {
|
||||
|
||||
}
|
||||
|
||||
function sponsorsLookup(id) {
|
||||
function sponsorsLookup(id, channelIDPromise) {
|
||||
v = document.querySelector('video') // Youtube video player
|
||||
//there is no video here
|
||||
if (v == null) {
|
||||
@@ -331,8 +377,10 @@ function sponsorsLookup(id) {
|
||||
//wait until it is loaded
|
||||
v.addEventListener('durationchange', updatePreviewBar);
|
||||
}
|
||||
|
||||
|
||||
//check database for sponsor times
|
||||
//made true once a setTimeout has been created to try again after a server error
|
||||
let recheckStarted = false;
|
||||
sendRequestToServer('GET', "/api/getVideoSponsorTimes?videoID=" + id, function(xmlhttp) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
sponsorDataFound = true;
|
||||
@@ -348,7 +396,17 @@ function sponsorsLookup(id) {
|
||||
updatePreviewBar();
|
||||
}
|
||||
|
||||
getChannelID();
|
||||
if (channelIDPromise != null) {
|
||||
if (channelIDPromise.isFulfilled) {
|
||||
whitelistCheck();
|
||||
} else if (channelIDPromise.isRejected) {
|
||||
//try again
|
||||
wait(getChannelID).then(whitelistCheck).catch();
|
||||
} else {
|
||||
//add it as a then statement
|
||||
channelIDPromise.then(whitelistCheck);
|
||||
}
|
||||
}
|
||||
|
||||
sponsorLookupRetries = 0;
|
||||
} else if (xmlhttp.readyState == 4 && xmlhttp.status == 404) {
|
||||
@@ -356,7 +414,7 @@ function sponsorsLookup(id) {
|
||||
|
||||
//check if this video was uploaded recently
|
||||
//use the invidious api to get the time published
|
||||
sendRequestToCustomServer('GET', "https://invidio.us/api/v1/videos/" + id, function(xmlhttp, error) {
|
||||
sendRequestToCustomServer('GET', "https://invidio.us/api/v1/videos/" + id + '?fields=published', function(xmlhttp, error) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
let unixTimePublished = JSON.parse(xmlhttp.responseText).published;
|
||||
|
||||
@@ -368,7 +426,9 @@ function sponsorsLookup(id) {
|
||||
});
|
||||
|
||||
sponsorLookupRetries = 0;
|
||||
} else if (xmlhttp.readyState == 4 && sponsorLookupRetries < 90) {
|
||||
} else if (xmlhttp.readyState == 4 && sponsorLookupRetries < 90 && !recheckStarted) {
|
||||
recheckStarted = true;
|
||||
|
||||
//some error occurred, try again in a second
|
||||
setTimeout(() => sponsorsLookup(id), 1000);
|
||||
|
||||
@@ -383,20 +443,35 @@ function sponsorsLookup(id) {
|
||||
}
|
||||
|
||||
function updatePreviewBar() {
|
||||
previewBar.set(sponsorTimes, [], v.duration);
|
||||
let localSponsorTimes = sponsorTimes;
|
||||
if (localSponsorTimes == null) localSponsorTimes = [];
|
||||
|
||||
let allSponsorTimes = localSponsorTimes.concat(sponsorTimesSubmitting);
|
||||
|
||||
//create an array of the sponsor types
|
||||
let types = [];
|
||||
for (let i = 0; i < localSponsorTimes.length; i++) {
|
||||
types.push("sponsor");
|
||||
}
|
||||
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
|
||||
types.push("previewSponsor");
|
||||
}
|
||||
|
||||
wait(() => previewBar !== null).then((result) => previewBar.set(allSponsorTimes, types, v.duration));
|
||||
|
||||
//update last video id
|
||||
lastPreviewBarUpdate = getYouTubeVideoID(document.URL);
|
||||
lastPreviewBarUpdate = sponsorVideoID;
|
||||
}
|
||||
|
||||
function getChannelID() {
|
||||
//get channel id
|
||||
let channelContainers = document.querySelectorAll("#owner-name");
|
||||
let channelContainers = document.querySelectorAll(".ytd-channel-name#text");
|
||||
let channelURLContainer = null;
|
||||
|
||||
for (let i = 0; i < channelContainers.length; i++) {
|
||||
if (channelContainers[i].firstElementChild != null) {
|
||||
channelURLContainer = channelContainers[i].firstElementChild;
|
||||
let child = channelContainers[i].firstElementChild;
|
||||
if (child != null && child.getAttribute("href") != "") {
|
||||
channelURLContainer = child;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,12 +485,34 @@ function getChannelID() {
|
||||
|
||||
if (channelURLContainer == null) {
|
||||
//try later
|
||||
setTimeout(getChannelID, 100);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
//first get the title to make sure a title change has occurred (otherwise the next video might still be loading)
|
||||
let titleInfoContainer = document.getElementById("info-contents");
|
||||
let currentTitle = "";
|
||||
if (titleInfoContainer != null) {
|
||||
currentTitle = titleInfoContainer.firstElementChild.firstElementChild.querySelector(".title").firstElementChild.innerText;
|
||||
} else {
|
||||
//old YouTube theme
|
||||
currentTitle = document.getElementById("eow-title").innerText;
|
||||
}
|
||||
|
||||
if (title == currentTitle) {
|
||||
//video hasn't changed yet, wait
|
||||
//try later
|
||||
return false;
|
||||
}
|
||||
title = currentTitle;
|
||||
|
||||
channelURL = channelURLContainer.getAttribute("href");
|
||||
|
||||
//reset variables
|
||||
channelWhitelisted = false;
|
||||
}
|
||||
|
||||
//checks if this channel is whitelisted, should be done only after the channelID has been loaded
|
||||
function whitelistCheck() {
|
||||
//see if this is a whitelisted channel
|
||||
chrome.storage.sync.get(["whitelistedChannels"], function(result) {
|
||||
let whitelistedChannels = result.whitelistedChannels;
|
||||
@@ -426,6 +523,23 @@ function getChannelID() {
|
||||
UUIDs = [];
|
||||
|
||||
channelWhitelisted = true;
|
||||
|
||||
//make sure the whitelistedChannels array isn't broken and full of null entries
|
||||
//TODO: remove this at some point in the future as the bug that caused this should be patched
|
||||
if (whitelistedChannels.some((el) => el === null)) {
|
||||
//remove the entries that are null
|
||||
let cleanWhitelistedChannelsArray = [];
|
||||
for (let i = 0; i < whitelistedChannels.length; i++) {
|
||||
let channelURL = whitelistedChannels[i];
|
||||
if (channelURL !== null) {
|
||||
//add it
|
||||
cleanWhitelistedChannelsArray.push(channelURL);
|
||||
}
|
||||
}
|
||||
|
||||
//save this value
|
||||
chrome.storage.sync.set({"whitelistedChannels": cleanWhitelistedChannelsArray});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -468,7 +582,7 @@ function checkSponsorTime(sponsorTimes, index, openNotice) {
|
||||
lastTime = v.currentTime - 0.0001;
|
||||
}
|
||||
|
||||
if (checkIfTimeToSkip(v.currentTime, sponsorTimes[index][0]) && !hiddenSponsorTimes.includes(index)) {
|
||||
if (checkIfTimeToSkip(v.currentTime, sponsorTimes[index][0], sponsorTimes[index][1]) && !hiddenSponsorTimes.includes(index)) {
|
||||
//skip it
|
||||
skipToTime(v, index, sponsorTimes, openNotice);
|
||||
|
||||
@@ -479,13 +593,13 @@ function checkSponsorTime(sponsorTimes, index, openNotice) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function checkIfTimeToSkip(currentVideoTime, startTime) {
|
||||
function checkIfTimeToSkip(currentVideoTime, startTime, endTime) {
|
||||
//If the sponsor time is in between these times, skip it
|
||||
//Checks if the last time skipped to is not too close to now, to make sure not to get too many
|
||||
// sponsor times in a row (from one troll)
|
||||
//the last term makes 0 second start times possible only if the video is not setup to start at a different time from zero
|
||||
return (Math.abs(currentVideoTime - startTime) < 3 && startTime >= lastTime && startTime <= currentVideoTime) ||
|
||||
(lastTime == -1 && startTime == 0 && youtubeVideoStartTime == null)
|
||||
(lastTime == -1 && startTime == 0 && currentVideoTime < endTime)
|
||||
}
|
||||
|
||||
//skip fromt he start time to the end time for a certain index sponsor time
|
||||
@@ -500,7 +614,16 @@ function skipToTime(v, index, sponsorTimes, openNotice) {
|
||||
if (openNotice) {
|
||||
//send out the message saying that a sponsor message was skipped
|
||||
if (!dontShowNotice) {
|
||||
new SkipNotice(this, currentUUID);
|
||||
let skipNotice = new SkipNotice(this, currentUUID);
|
||||
|
||||
if (dontShowNoticeOld) {
|
||||
//show why this notice is showing
|
||||
skipNotice.addNoticeInfoMessage(chrome.i18n.getMessage("noticeUpdate"), chrome.i18n.getMessage("noticeUpdate2"));
|
||||
|
||||
//remove this setting
|
||||
chrome.storage.sync.remove(["dontShowNoticeAgain"]);
|
||||
dontShowNoticeOld = false;
|
||||
}
|
||||
|
||||
//auto-upvote this sponsor
|
||||
if (trackViewCount) {
|
||||
@@ -529,57 +652,68 @@ function reskipSponsorTime(UUID) {
|
||||
}
|
||||
}
|
||||
|
||||
//Adds a sponsorship starts button to the player controls
|
||||
function addPlayerControlsButton() {
|
||||
if (document.getElementById("startSponsorButton") != null) {
|
||||
//it's already added
|
||||
return;
|
||||
}
|
||||
|
||||
let startSponsorButton = document.createElement("button");
|
||||
startSponsorButton.id = "startSponsorButton";
|
||||
startSponsorButton.className = "ytp-button playerButton";
|
||||
startSponsorButton.setAttribute("title", chrome.i18n.getMessage("sponsorStart"));
|
||||
startSponsorButton.addEventListener("click", startSponsorClicked);
|
||||
|
||||
let startSponsorImage = document.createElement("img");
|
||||
startSponsorImage.id = "startSponsorImage";
|
||||
startSponsorImage.className = "playerButtonImage";
|
||||
startSponsorImage.src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png");
|
||||
|
||||
//add the image to the button
|
||||
startSponsorButton.appendChild(startSponsorImage);
|
||||
|
||||
let controls = document.getElementsByClassName("ytp-right-controls");
|
||||
let referenceNode = controls[controls.length - 1];
|
||||
|
||||
if (referenceNode == undefined) {
|
||||
//page not loaded yet
|
||||
setTimeout(addPlayerControlsButton, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
referenceNode.prepend(startSponsorButton);
|
||||
}
|
||||
|
||||
function removePlayerControlsButton() {
|
||||
if (!sponsorVideoID) return;
|
||||
|
||||
document.getElementById("startSponsorButton").style.display = "none";
|
||||
document.getElementById("submitButton").style.display = "none";
|
||||
}
|
||||
|
||||
//adds or removes the player controls button to what it should be
|
||||
function updateVisibilityOfPlayerControlsButton() {
|
||||
//not on a proper video yet
|
||||
if (!getYouTubeVideoID(document.URL)) return;
|
||||
function createButton(baseID, title, callback, imageName, isDraggable=false) {
|
||||
if (document.getElementById(baseID + "Button") != null) return;
|
||||
|
||||
addPlayerControlsButton();
|
||||
addInfoButton();
|
||||
addDeleteButton();
|
||||
addSubmitButton();
|
||||
// Button HTML
|
||||
let newButton = document.createElement("button");
|
||||
newButton.draggable = isDraggable;
|
||||
newButton.id = baseID + "Button";
|
||||
newButton.className = "ytp-button playerButton";
|
||||
newButton.setAttribute("title", chrome.i18n.getMessage(title));
|
||||
newButton.addEventListener("click", callback);
|
||||
|
||||
// Image HTML
|
||||
let newButtonImage = document.createElement("img");
|
||||
newButton.draggable = isDraggable;
|
||||
newButtonImage.id = baseID + "Image";
|
||||
newButtonImage.className = "playerButtonImage";
|
||||
newButtonImage.src = chrome.extension.getURL("icons/" + imageName);
|
||||
|
||||
// Append image to button
|
||||
newButton.appendChild(newButtonImage);
|
||||
|
||||
// Add the button to player
|
||||
controls.prepend(newButton);
|
||||
}
|
||||
|
||||
function getControls() {
|
||||
let controls = document.getElementsByClassName("ytp-right-controls");
|
||||
return (!controls || controls.length === 0) ? false : controls[controls.length - 1]
|
||||
};
|
||||
|
||||
//adds all the player controls buttons
|
||||
async function createButtons() {
|
||||
let result = await wait(getControls).catch();
|
||||
|
||||
//set global controls variable
|
||||
controls = result;
|
||||
|
||||
// Add button if does not already exist in html
|
||||
createButton("startSponsor", "sponsorStart", startSponsorClicked, "PlayerStartIconSponsorBlocker256px.png");
|
||||
createButton("info", "openPopup", openInfoMenu, "PlayerInfoIconSponsorBlocker256px.png")
|
||||
createButton("delete", "clearTimes", clearSponsorTimes, "PlayerDeleteIconSponsorBlocker256px.png");
|
||||
createButton("submit", "SubmitTimes", submitSponsorTimes, "PlayerUploadIconSponsorBlocker256px.png");
|
||||
}
|
||||
//adds or removes the player controls button to what it should be
|
||||
async function updateVisibilityOfPlayerControlsButton() {
|
||||
//not on a proper video yet
|
||||
if (!sponsorVideoID) return;
|
||||
|
||||
await createButtons();
|
||||
|
||||
if (hideVideoPlayerControls) {
|
||||
removePlayerControlsButton();
|
||||
}
|
||||
if (hideInfoButtonPlayerControls) {
|
||||
//don't show the info button on embeds
|
||||
if (hideInfoButtonPlayerControls || document.URL.includes("/embed/")) {
|
||||
document.getElementById("infoButton").style.display = "none";
|
||||
}
|
||||
if (hideDeleteButtonPlayerControls) {
|
||||
@@ -597,7 +731,7 @@ function startSponsorClicked() {
|
||||
chrome.runtime.sendMessage({
|
||||
message: "addSponsorTime",
|
||||
time: v.currentTime,
|
||||
videoID: getYouTubeVideoID(document.URL)
|
||||
videoID: sponsorVideoID
|
||||
}, function(response) {
|
||||
//see if the sponsorTimesSubmitting needs to be updated
|
||||
updateSponsorTimesSubmitting();
|
||||
@@ -607,7 +741,7 @@ function startSponsorClicked() {
|
||||
function updateSponsorTimesSubmitting() {
|
||||
chrome.runtime.sendMessage({
|
||||
message: "getSponsorTimes",
|
||||
videoID: getYouTubeVideoID(document.URL)
|
||||
videoID: sponsorVideoID
|
||||
}, function(response) {
|
||||
if (response != undefined) {
|
||||
let sponsorTimes = response.sponsorTimes;
|
||||
@@ -615,18 +749,27 @@ function updateSponsorTimesSubmitting() {
|
||||
//see if this data should be saved in the sponsorTimesSubmitting variable
|
||||
if (sponsorTimes != undefined) {
|
||||
sponsorTimesSubmitting = sponsorTimes;
|
||||
|
||||
updatePreviewBar();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function changeStartSponsorButton(showStartSponsor, uploadButtonVisible) {
|
||||
//is the submit button on the player loaded yet
|
||||
function isSubmitButtonLoaded() {
|
||||
return document.getElementById("submitButton") !== null;
|
||||
}
|
||||
|
||||
async function changeStartSponsorButton(showStartSponsor, uploadButtonVisible) {
|
||||
if(!sponsorVideoID) return false;
|
||||
|
||||
//make sure submit button is loaded
|
||||
await wait(isSubmitButtonLoaded);
|
||||
|
||||
//if it isn't visible, there is no data
|
||||
if (uploadButtonVisible && !hideDeleteButtonPlayerControls) {
|
||||
document.getElementById("deleteButton").style.display = "unset";
|
||||
} else {
|
||||
document.getElementById("deleteButton").style.display = "none";
|
||||
}
|
||||
let shouldHide = (uploadButtonVisible && !hideDeleteButtonPlayerControls) ? "unset" : "none"
|
||||
document.getElementById("deleteButton").style.display = shouldHide;
|
||||
|
||||
if (showStartSponsor) {
|
||||
showingStartSponsor = true;
|
||||
@@ -653,112 +796,6 @@ function toggleStartSponsorButton() {
|
||||
changeStartSponsorButton(!showingStartSponsor, true);
|
||||
}
|
||||
|
||||
//shows the info button on the video player
|
||||
function addInfoButton() {
|
||||
if (document.getElementById("infoButton") != null) {
|
||||
//it's already added
|
||||
return;
|
||||
}
|
||||
|
||||
//make a submit button
|
||||
let infoButton = document.createElement("button");
|
||||
infoButton.id = "infoButton";
|
||||
infoButton.className = "ytp-button playerButton";
|
||||
infoButton.setAttribute("title", "Open SponsorBlock Popup");
|
||||
infoButton.addEventListener("click", openInfoMenu);
|
||||
|
||||
let infoImage = document.createElement("img");
|
||||
infoImage.id = "infoButtonImage";
|
||||
infoImage.className = "playerButtonImage";
|
||||
infoImage.src = chrome.extension.getURL("icons/PlayerInfoIconSponsorBlocker256px.png");
|
||||
|
||||
//add the image to the button
|
||||
infoButton.appendChild(infoImage);
|
||||
|
||||
let controls = document.getElementsByClassName("ytp-right-controls");
|
||||
let referenceNode = controls[controls.length - 1];
|
||||
|
||||
if (referenceNode == undefined) {
|
||||
//page not loaded yet
|
||||
setTimeout(addInfoButton, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
referenceNode.prepend(infoButton);
|
||||
}
|
||||
|
||||
//shows the delete button on the video player
|
||||
function addDeleteButton() {
|
||||
if (document.getElementById("deleteButton") != null) {
|
||||
//it's already added
|
||||
return;
|
||||
}
|
||||
|
||||
//make a submit button
|
||||
let deleteButton = document.createElement("button");
|
||||
deleteButton.id = "deleteButton";
|
||||
deleteButton.className = "ytp-button playerButton";
|
||||
deleteButton.setAttribute("title", "Clear Sponsor Times");
|
||||
deleteButton.addEventListener("click", clearSponsorTimes);
|
||||
//hide it at the start
|
||||
deleteButton.style.display = "none";
|
||||
|
||||
let deleteImage = document.createElement("img");
|
||||
deleteImage.id = "deleteButtonImage";
|
||||
deleteImage.className = "playerButtonImage";
|
||||
deleteImage.src = chrome.extension.getURL("icons/PlayerDeleteIconSponsorBlocker256px.png");
|
||||
|
||||
//add the image to the button
|
||||
deleteButton.appendChild(deleteImage);
|
||||
|
||||
let controls = document.getElementsByClassName("ytp-right-controls");
|
||||
let referenceNode = controls[controls.length - 1];
|
||||
|
||||
if (referenceNode == undefined) {
|
||||
//page not loaded yet
|
||||
setTimeout(addDeleteButton, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
referenceNode.prepend(deleteButton);
|
||||
}
|
||||
|
||||
//shows the submit button on the video player
|
||||
function addSubmitButton() {
|
||||
if (document.getElementById("submitButton") != null) {
|
||||
//it's already added
|
||||
return;
|
||||
}
|
||||
|
||||
//make a submit button
|
||||
let submitButton = document.createElement("button");
|
||||
submitButton.id = "submitButton";
|
||||
submitButton.className = "ytp-button playerButton";
|
||||
submitButton.setAttribute("title", "Submit Sponsor Times");
|
||||
submitButton.addEventListener("click", submitSponsorTimes);
|
||||
//hide it at the start
|
||||
submitButton.style.display = "none";
|
||||
|
||||
let submitImage = document.createElement("img");
|
||||
submitImage.id = "submitButtonImage";
|
||||
submitImage.className = "playerButtonImage";
|
||||
submitImage.src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker256px.png");
|
||||
|
||||
//add the image to the button
|
||||
submitButton.appendChild(submitImage);
|
||||
|
||||
let controls = document.getElementsByClassName("ytp-right-controls");
|
||||
let referenceNode = controls[controls.length - 1];
|
||||
|
||||
if (referenceNode == undefined) {
|
||||
//page not loaded yet
|
||||
setTimeout(addSubmitButton, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
referenceNode.prepend(submitButton);
|
||||
}
|
||||
|
||||
function openInfoMenu() {
|
||||
if (document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||
//it's already added
|
||||
@@ -786,11 +823,18 @@ function openInfoMenu() {
|
||||
//add the close button
|
||||
popup.prepend(closeButton);
|
||||
|
||||
let parentNode = document.getElementById("secondary");
|
||||
let parentNodes = document.querySelectorAll("#secondary");
|
||||
let parentNode = null;
|
||||
for (let i = 0; i < parentNodes.length; i++) {
|
||||
if (parentNodes[i].firstElementChild !== null) {
|
||||
parentNode = parentNodes[i];
|
||||
}
|
||||
}
|
||||
if (parentNode == null) {
|
||||
//old youtube theme
|
||||
parentNode = document.getElementById("watch7-sidebar-contents");
|
||||
}
|
||||
|
||||
|
||||
//make the logo source not 404
|
||||
//query selector must be used since getElementByID doesn't work on a node and this isn't added to the document yet
|
||||
@@ -814,8 +858,10 @@ function closeInfoMenu() {
|
||||
if (popup != null) {
|
||||
popup.remove();
|
||||
|
||||
//show info button
|
||||
document.getElementById("infoButton").style.display = "unset";
|
||||
//show info button if it's not an embed
|
||||
if (!document.URL.includes("/embed/")) {
|
||||
document.getElementById("infoButton").style.display = "unset";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -823,7 +869,7 @@ function clearSponsorTimes() {
|
||||
//it can't update to this info yet
|
||||
closeInfoMenu();
|
||||
|
||||
let currentVideoID = getYouTubeVideoID(document.URL);
|
||||
let currentVideoID = sponsorVideoID;
|
||||
|
||||
let sponsorTimeKey = 'sponsorTimes' + currentVideoID;
|
||||
chrome.storage.sync.get([sponsorTimeKey], function(result) {
|
||||
@@ -841,6 +887,8 @@ function clearSponsorTimes() {
|
||||
//clear sponsor times submitting
|
||||
sponsorTimesSubmitting = [];
|
||||
|
||||
updatePreviewBar();
|
||||
|
||||
//set buttons to be correct
|
||||
changeStartSponsorButton(true, false);
|
||||
}
|
||||
@@ -863,8 +911,8 @@ function vote(type, UUID, skipNotice) {
|
||||
if (response != undefined) {
|
||||
//see if it was a success or failure
|
||||
if (skipNotice != null) {
|
||||
if (response.successType == 1) {
|
||||
//success
|
||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||
//success (treat rate limits as a success)
|
||||
if (type == 0) {
|
||||
skipNotice.afterDownvote.bind(skipNotice)();
|
||||
}
|
||||
@@ -896,7 +944,7 @@ function closeAllSkipNotices(){
|
||||
}
|
||||
|
||||
function dontShowNoticeAgain() {
|
||||
chrome.storage.sync.set({"dontShowNoticeAgain": true});
|
||||
chrome.storage.sync.set({"dontShowNotice": true});
|
||||
|
||||
dontShowNotice = true;
|
||||
|
||||
@@ -904,15 +952,15 @@ function dontShowNoticeAgain() {
|
||||
}
|
||||
|
||||
function sponsorMessageStarted(callback) {
|
||||
v = document.querySelector('video');
|
||||
v = document.querySelector('video');
|
||||
|
||||
//send back current time
|
||||
callback({
|
||||
time: v.currentTime
|
||||
})
|
||||
//send back current time
|
||||
callback({
|
||||
time: v.currentTime
|
||||
})
|
||||
|
||||
//update button
|
||||
toggleStartSponsorButton();
|
||||
//update button
|
||||
toggleStartSponsorButton();
|
||||
}
|
||||
|
||||
function submitSponsorTimes() {
|
||||
@@ -924,15 +972,24 @@ function submitSponsorTimes() {
|
||||
//it can't update to this info yet
|
||||
closeInfoMenu();
|
||||
|
||||
let currentVideoID = getYouTubeVideoID(document.URL);
|
||||
let currentVideoID = sponsorVideoID;
|
||||
|
||||
let sponsorTimeKey = 'sponsorTimes' + currentVideoID;
|
||||
chrome.storage.sync.get([sponsorTimeKey], function(result) {
|
||||
let sponsorTimes = result[sponsorTimeKey];
|
||||
|
||||
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
||||
let confirmMessage = "Are you sure you want to submit this?\n\n" + getSponsorTimesMessage(sponsorTimes);
|
||||
confirmMessage += "\n\nTo edit or delete values, click the info button or open the extension popup by clicking the extension icon in the top right corner."
|
||||
//check if a sponsor exceeds the duration of the video
|
||||
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||
if (sponsorTimes[i][1] > v.duration) {
|
||||
sponsorTimes[i][1] = v.duration;
|
||||
}
|
||||
}
|
||||
//update sponsorTimes
|
||||
chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes});
|
||||
|
||||
let confirmMessage = chrome.i18n.getMessage("submitCheck") + "\n\n" + getSponsorTimesMessage(sponsorTimes);
|
||||
confirmMessage += "\n\n" + chrome.i18n.getMessage("confirmMSG");
|
||||
if(!confirm(confirmMessage)) return;
|
||||
|
||||
sendSubmitMessage();
|
||||
@@ -945,10 +1002,10 @@ function submitSponsorTimes() {
|
||||
//called after all the checks have been made that it's okay to do so
|
||||
function sendSubmitMessage(){
|
||||
//add loading animation
|
||||
document.getElementById("submitButtonImage").src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker256px.png");
|
||||
document.getElementById("submitImage").src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker256px.png");
|
||||
document.getElementById("submitButton").style.animation = "rotate 1s 0s infinite";
|
||||
|
||||
let currentVideoID = getYouTubeVideoID(document.URL);
|
||||
let currentVideoID = sponsorVideoID;
|
||||
|
||||
chrome.runtime.sendMessage({
|
||||
message: "submitTimes",
|
||||
@@ -980,7 +1037,7 @@ function sendSubmitMessage(){
|
||||
} else {
|
||||
//show that the upload failed
|
||||
document.getElementById("submitButton").style.animation = "unset";
|
||||
document.getElementById("submitButtonImage").src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png");
|
||||
document.getElementById("submitImage").src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png");
|
||||
|
||||
if([400,429,409,502].includes(response.statusCode)) {
|
||||
alert(chrome.i18n.getMessage(response.statusCode));
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "__MSG_Name__",
|
||||
"version": "1.1.0",
|
||||
"version": "1.1.9.1",
|
||||
"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": [
|
||||
|
||||
101
popup.html
101
popup.html
@@ -1,6 +1,6 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>SponsorBlock Popup</title>
|
||||
<title>__MSG_openPopup__</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>
|
||||
@@ -10,10 +10,10 @@
|
||||
<div id="app" class="popupBody">
|
||||
<img src="icons/LogoSponsorBlocker256px.png" height="64px" id="sponsorBlockPopupLogo"/>
|
||||
|
||||
<h1 class="popupElement">SponsorBlock</h1>
|
||||
<h1 class="popupElement">__MSG_Name__</h1>
|
||||
|
||||
<!-- Loading text -->
|
||||
<p id="loadingIndicator" class="popupElement">Loading...</p>
|
||||
<p id="loadingIndicator" class="popupElement">__MSG_Loading__</p>
|
||||
|
||||
<!-- Hidden until loading complete -->
|
||||
<div id="mainControls" class="main popupElement" style="display: none">
|
||||
@@ -29,21 +29,21 @@
|
||||
<br/>
|
||||
|
||||
<div>
|
||||
<button id="whitelistChannel" class="whitelistButton popupElement">Whitelist Channel</button>
|
||||
<button id="unwhitelistChannel" class="whitelistButton popupElement" style="display: none">Remove Channel From Whitelist</button>
|
||||
<button id="whitelistChannel" class="whitelistButton popupElement">__MSG_whitelistChannel__</button>
|
||||
<button id="unwhitelistChannel" class="whitelistButton popupElement" style="display: none">__MSG_removeFromWhitelist__</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.
|
||||
__MSG_whitelistDescription__
|
||||
</sub>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<button id="reportAnIssue" class="dangerButton popupElement">Vote On A Sponsor Time</button>
|
||||
<button id="reportAnIssue" class="dangerButton popupElement">__MSG_voteOnTime__</button>
|
||||
|
||||
<div id="issueReporterContainer" class="popupElement" style="display: none">
|
||||
|
||||
<h3 style="margin-top: 0px" class="popupElement">Vote On A Sponsor Time</h3>
|
||||
<h3 style="margin-top: 0px" class="popupElement">__MSG_voteOnTime__</h3>
|
||||
|
||||
<div id="issueReporterTimeButtons" class="popupElement">
|
||||
|
||||
@@ -51,47 +51,47 @@
|
||||
|
||||
</div>
|
||||
|
||||
<h2 class="recordingSubtitle popupElement">Record the times of a sponsorship</h2>
|
||||
<h2 class="recordingSubtitle popupElement">__MSG_recordTimes__</h2>
|
||||
|
||||
<p class="popupElement">
|
||||
<span id=sponsorTimesContributionsContainer class="popupElement" style="display: none">
|
||||
So far, you've submitted
|
||||
__MSG_soFarUHSubmited__
|
||||
<span id="sponsorTimesContributionsDisplay" class="popupElement">
|
||||
0
|
||||
</span>
|
||||
<span id="sponsorTimesContributionsDisplayEndWord" class="popupElement">
|
||||
sponsors.
|
||||
__MSG_Sponsors__.
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<span id=sponsorTimesViewsContainer class="popupElement" style="display: none">
|
||||
You have saved people from
|
||||
__MSG_savedPeopleFrom__
|
||||
<span id="sponsorTimesViewsDisplay" class="popupElement">
|
||||
0
|
||||
</span>
|
||||
<span id="sponsorTimesViewsDisplayEndWord" class="popupElement">
|
||||
sponsor segments.
|
||||
__MSG_Segments__.
|
||||
__MSG_savedPeopleFrom__
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<div class="popupElement">
|
||||
View the leaderboard <a class="popupElement discreteLink" href="https://sponsor.ajay.app/stats" target="_blank">here</a>.
|
||||
__MSG_viewLeaderboard__ <a class="popupElement discreteLink" href="https://sponsor.ajay.app/stats" target="_blank">__MSG_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.
|
||||
__MSG_recordTimesDescription__
|
||||
</p>
|
||||
|
||||
<div>
|
||||
<button id="sponsorStart" class="greenButton popupElement">Sponsorship Starts Now</button>
|
||||
<button id="sponsorStart" class="greenButton popupElement">__MSG_sponsorStart__</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>
|
||||
<sub class="popupElement">__MSG_popupHint__</sub>
|
||||
|
||||
<div id="submissionSection" class="popupElement" style="display: none">
|
||||
<h3 class="popupElement">Latest Sponsor Message Times Chosen</h3>
|
||||
<h3 class="popupElement">__MSG_lastTimes__</h3>
|
||||
<b>
|
||||
<div id="sponsorMessageTimes" class="popupElement">
|
||||
|
||||
@@ -100,13 +100,13 @@
|
||||
|
||||
<br/>
|
||||
|
||||
<button id="clearTimes" class="smallButton popupElement">Clear Times</button>
|
||||
<button id="clearTimes" class="smallButton popupElement">__MSG_clearTimesButton__</button>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div id="submitTimesContainer" class="popupElement" style="display: none">
|
||||
<button id="submitTimes" class="smallButton popupElement">Submit Times</button>
|
||||
<button id="submitTimes" class="smallButton popupElement">__MSG_submitTimesButton__</button>
|
||||
|
||||
<div id="submitTimesInfoMessageContainer" class="popupElement" style="display: none">
|
||||
<h3 id="submitTimesInfoMessage" class="popupElement">
|
||||
@@ -122,17 +122,17 @@
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<button id="setUsernameButton" class="warningButton popupElement">Set Username</button>
|
||||
<button id="setUsernameButton" class="warningButton popupElement">__MSG_setUsername__</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>.
|
||||
__MSG_publicStats__ <a class="popupElement discreteLink" href="https://sponsor.ajay.app/stats" target="_blank">__MSG_here__</a>.
|
||||
</sub>
|
||||
</div>
|
||||
|
||||
<div id="setUsername" class="popupElement" style="display: none">
|
||||
<br/>
|
||||
|
||||
<h3>Set Username</h3>
|
||||
<h3>__MSG_setUsername__</h3>
|
||||
|
||||
<div id="setUsernameStatusContainer" style="display: none">
|
||||
<h2 id="setUsernameStatus"></h2>
|
||||
@@ -154,72 +154,79 @@
|
||||
|
||||
<br/>
|
||||
|
||||
Come join the official discord server to give suggestions and feedback!
|
||||
__MSG_discordAdvert__
|
||||
|
||||
<br/>
|
||||
|
||||
<span id="hideDiscordButton" class="smallLink popupElement">Hide this</span>
|
||||
<span id="hideDiscordButton" class="smallLink popupElement">__MSG_hideThis__</span>
|
||||
</div>
|
||||
|
||||
<div id="optionsButtonContainer" class="popupElement">
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<button id="optionsButton" class="dangerButton popupElement">Options</button>
|
||||
<button id="optionsButton" class="dangerButton popupElement">__MSG_Options__</button>
|
||||
</div>
|
||||
|
||||
<div id="options" class="popupElement" style="display: none">
|
||||
<br/>
|
||||
|
||||
<h3>Options</h3>
|
||||
<h3>__MSG_Options__</h3>
|
||||
|
||||
<span id="keybindButtons">
|
||||
<button id="setStartSponsorKeybind" class="warningButton popupElement">__MSG_setStartSponsorShortcut__</button>
|
||||
<br/>
|
||||
<br/>
|
||||
<button id="setSubmitKeybind" class="warningButton popupElement">__MSG_setSubmitKeybind__</button>
|
||||
<br/>
|
||||
</span>
|
||||
|
||||
<h2 id="keybindDescription" style="display: none" class="popupElement">__MSG_keybindDescription__</h2>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<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>
|
||||
<button id="hideVideoPlayerControls" class="warningButton popupElement">__MSG_hideButtons__</button>
|
||||
<button id="showVideoPlayerControls" style="display: none" class="warningButton popupElement">__MSG_showButtons__</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.
|
||||
__MSG_hideButtonsDescription__
|
||||
</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>
|
||||
<button id="hideInfoButtonPlayerControls" class="warningButton popupElement">__MSG_hideInfoButton__</button>
|
||||
<button id="showInfoButtonPlayerControls" style="display: none" class="warningButton popupElement">__MSG_showInfoButton__</button>
|
||||
<br/>
|
||||
<sub class="popupElement">
|
||||
This is the button that opens up a popup in the YouTube page.
|
||||
__MSG_whatInfoButton__
|
||||
</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>
|
||||
<button id="hideDeleteButtonPlayerControls" class="warningButton popupElement">__MSG_hideDeleteButton__</button>
|
||||
<button id="showDeleteButtonPlayerControls" style="display: none" class="warningButton popupElement">__MSG_showDeleteButton__</button>
|
||||
<br/>
|
||||
<sub class="popupElement">
|
||||
This is the button that allows you to clear all sponsors on the YouTube player.
|
||||
__MSG_whatDeleteButton__
|
||||
</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>
|
||||
<button id="disableSponsorViewTracking" class="warningButton popupElement">__MSG_disableViewTracking__</button>
|
||||
<button id="enableSponsorViewTracking" style="display: none" class="warningButton popupElement">__MSG_enableViewTracking__</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. :)
|
||||
__MSG_whatViewTracking__
|
||||
</sub>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">Show Notice Again</button>
|
||||
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
56
popup.js
56
popup.js
@@ -1,6 +1,7 @@
|
||||
|
||||
//make this a function to allow this to run on the content page
|
||||
function runThePopup() {
|
||||
localizeHtmlPage();
|
||||
|
||||
//is it in the popup or content script
|
||||
var inPopup = true;
|
||||
@@ -69,6 +70,10 @@ function runThePopup() {
|
||||
"videoFound",
|
||||
"sponsorMessageTimes",
|
||||
"downloadedSponsorMessageTimes",
|
||||
// Keybinds
|
||||
"setStartSponsorKeybind",
|
||||
"setSubmitKeybind",
|
||||
"keybindDescription"
|
||||
].forEach(id => SB[id] = document.getElementById(id));
|
||||
|
||||
//setup click listeners
|
||||
@@ -78,6 +83,8 @@ function runThePopup() {
|
||||
SB.clearTimes.addEventListener("click", clearTimes);
|
||||
SB.submitTimes.addEventListener("click", submitTimes);
|
||||
SB.showNoticeAgain.addEventListener("click", showNoticeAgain);
|
||||
SB.setStartSponsorKeybind.addEventListener("click", () => setKeybind(true));
|
||||
SB.setSubmitKeybind.addEventListener("click", () => setKeybind(false));
|
||||
SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls);
|
||||
SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls);
|
||||
SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls);
|
||||
@@ -103,6 +110,9 @@ function runThePopup() {
|
||||
|
||||
//is this a YouTube tab?
|
||||
let isYouTubeTab = false;
|
||||
|
||||
// Is the start sponsor keybind currently being set
|
||||
let setStartSponsorKeybind = false;
|
||||
|
||||
//see if discord link can be shown
|
||||
chrome.storage.sync.get(["hideDiscordLink"], function(result) {
|
||||
@@ -126,9 +136,9 @@ function runThePopup() {
|
||||
|
||||
//if the don't show notice again letiable is true, an option to
|
||||
// disable should be available
|
||||
chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) {
|
||||
let dontShowNoticeAgain = result.dontShowNoticeAgain;
|
||||
if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) {
|
||||
chrome.storage.sync.get(["dontShowNotice"], function(result) {
|
||||
let dontShowNotice = result.dontShowNotice;
|
||||
if (dontShowNotice != undefined && dontShowNotice) {
|
||||
SB.showNoticeAgain.style.display = "unset";
|
||||
}
|
||||
});
|
||||
@@ -818,7 +828,7 @@ function runThePopup() {
|
||||
}
|
||||
|
||||
function showNoticeAgain() {
|
||||
chrome.storage.sync.set({"dontShowNoticeAgain": false});
|
||||
chrome.storage.sync.set({"dontShowNotice": false});
|
||||
|
||||
chrome.tabs.query({
|
||||
active: true,
|
||||
@@ -981,7 +991,7 @@ function runThePopup() {
|
||||
//set it to false
|
||||
function resetStartTimeChosen() {
|
||||
startTimeChosen = false;
|
||||
SB.sponsorStart.innerHTML = "SP_START";
|
||||
SB.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorStart");
|
||||
}
|
||||
|
||||
//hides and shows the submit times button when needed
|
||||
@@ -1101,8 +1111,8 @@ function runThePopup() {
|
||||
}, function(response) {
|
||||
if (response != undefined) {
|
||||
//see if it was a success or failure
|
||||
if (response.successType == 1) {
|
||||
//success
|
||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||
//success (treat rate limits as a success)
|
||||
addVoteMessage(chrome.i18n.getMessage("voted"), UUID)
|
||||
} else if (response.successType == 0) {
|
||||
//failure: duplicate vote
|
||||
@@ -1235,7 +1245,35 @@ function runThePopup() {
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function setKeybind(startSponsorKeybind) {
|
||||
document.getElementById("keybindButtons").style.display = "none";
|
||||
|
||||
document.getElementById("keybindDescription").style.display = "initial";
|
||||
document.getElementById("keybindDescription").innerText = chrome.i18n.getMessage("keybindDescription");
|
||||
|
||||
setStartSponsorKeybind = startSponsorKeybind;
|
||||
|
||||
document.addEventListener("keydown", onKeybindSet)
|
||||
}
|
||||
|
||||
function onKeybindSet(e) {
|
||||
e = e || window.event;
|
||||
var key = e.key;
|
||||
|
||||
if (setStartSponsorKeybind) {
|
||||
chrome.storage.sync.set({"startSponsorKeybind": key});
|
||||
} else {
|
||||
chrome.storage.sync.set({"submitKeybind": key});
|
||||
}
|
||||
|
||||
document.removeEventListener("keydown", onKeybindSet);
|
||||
|
||||
document.getElementById("keybindDescription").innerText = chrome.i18n.getMessage("keybindDescriptionComplete") + " " + key;
|
||||
|
||||
document.getElementById("keybindButtons").style.display = "unset";
|
||||
}
|
||||
|
||||
//converts time in seconds to minutes
|
||||
function getTimeInMinutes(seconds) {
|
||||
let minutes = Math.floor(seconds / 60);
|
||||
@@ -1278,7 +1316,7 @@ function runThePopup() {
|
||||
|
||||
if (chrome.tabs != undefined) {
|
||||
//add the width restriction (because Firefox)
|
||||
document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 300 }', 0);
|
||||
document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 325 }', 0);
|
||||
|
||||
//this means it is actually opened in the popup
|
||||
runThePopup();
|
||||
|
||||
77
utils.js
77
utils.js
@@ -1,37 +1,68 @@
|
||||
// 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);
|
||||
|
||||
let intervalCheck = () => {
|
||||
let result = condition();
|
||||
if (result !== false) {
|
||||
resolve(result);
|
||||
clearInterval(interval);
|
||||
};
|
||||
};
|
||||
|
||||
let interval = setInterval(intervalCheck, check);
|
||||
|
||||
//run the check once first, this speeds it up a lot
|
||||
intervalCheck();
|
||||
});
|
||||
}
|
||||
|
||||
function getYouTubeVideoID(url) {
|
||||
//Attempt to parse url
|
||||
let urlObject = null;
|
||||
try {
|
||||
urlObject = new URL(url);
|
||||
urlObject = new URL(url);
|
||||
} catch (e) {
|
||||
console.error("[SB] Unable to parse URL: " + url);
|
||||
return false
|
||||
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;
|
||||
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;
|
||||
}
|
||||
try {
|
||||
return urlObject.pathname.substr(7, 11);
|
||||
} catch (e) {
|
||||
console.error("[SB] Video ID not valid for " + url);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function localizeHtmlPage() {
|
||||
//Localize by replacing __MSG_***__ meta tags
|
||||
var objects = document.getElementsByClassName("popupBody")[0].children;
|
||||
for (var j = 0; j < objects.length; j++) {
|
||||
var obj = objects[j];
|
||||
|
||||
var valStrH = obj.innerHTML.toString();
|
||||
var valNewH = valStrH.replace(/__MSG_(\w+)__/g, function(match, v1)
|
||||
{
|
||||
return v1 ? chrome.i18n.getMessage(v1) : "";
|
||||
});
|
||||
|
||||
if(valNewH != valStrH)
|
||||
{
|
||||
obj.innerHTML = valNewH;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//returns the start time of the video if there was one specified (ex. ?t=5s)
|
||||
function getYouTubeVideoStartTime(url) {
|
||||
let searchParams = new URL(url).searchParams;
|
||||
let startTime = searchParams.get("t");
|
||||
if (startTime == null) {
|
||||
startTime = searchParams.get("time_continue");
|
||||
}
|
||||
|
||||
return startTime;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,10 @@ let barTypes = {
|
||||
"sponsor": {
|
||||
color: "#00d400",
|
||||
opacity: "0.5"
|
||||
},
|
||||
"previewSponsor": {
|
||||
color: "#0000d4",
|
||||
opacity: "0.5"
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -294,21 +294,37 @@ class SkipNotice {
|
||||
}
|
||||
}
|
||||
|
||||
addNoticeInfoMessage(message) {
|
||||
addNoticeInfoMessage(message, message2) {
|
||||
let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + this.idSuffix);
|
||||
if (previousInfoMessage != null) {
|
||||
//remove it
|
||||
document.getElementById("sponsorSkipNotice" + this.idSuffix).removeChild(previousInfoMessage);
|
||||
}
|
||||
|
||||
let previousInfoMessage2 = document.getElementById("sponsorTimesInfoMessage" + this.idSuffix + "2");
|
||||
if (previousInfoMessage2 != null) {
|
||||
//remove it
|
||||
document.getElementById("sponsorSkipNotice" + this.idSuffix).removeChild(previousInfoMessage2);
|
||||
}
|
||||
|
||||
//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));
|
||||
|
||||
if (message2 !== undefined) {
|
||||
let thanksForVotingText2 = document.createElement("p");
|
||||
thanksForVotingText2.id = "sponsorTimesInfoMessage" + this.idSuffix + "2";
|
||||
thanksForVotingText2.className = "sponsorTimesInfoMessage";
|
||||
thanksForVotingText2.innerText = message2;
|
||||
|
||||
//add element to div
|
||||
document.getElementById("sponsorSkipNotice" + this.idSuffix).insertBefore(thanksForVotingText2, document.getElementById("sponsorSkipNoticeSpacer" + this.idSuffix));
|
||||
}
|
||||
}
|
||||
|
||||
resetNoticeInfoMessage() {
|
||||
@@ -337,7 +353,7 @@ class SkipNotice {
|
||||
thanksForVotingText.id = "sponsorTimesVoteButtonInfoMessage" + this.idSuffix;
|
||||
thanksForVotingText.className = "sponsorTimesInfoMessage sponsorTimesVoteButtonMessage";
|
||||
thanksForVotingText.innerText = message;
|
||||
|
||||
|
||||
//add element to div
|
||||
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).prepend(thanksForVotingText);
|
||||
}
|
||||
@@ -348,17 +364,23 @@ class SkipNotice {
|
||||
//remove it
|
||||
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).removeChild(previousInfoMessage);
|
||||
}
|
||||
|
||||
|
||||
//show button again
|
||||
document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix).style.removeProperty("display");
|
||||
}
|
||||
|
||||
//close this notice
|
||||
close() {
|
||||
//reset message
|
||||
this.resetNoticeInfoMessage();
|
||||
|
||||
let notice = document.getElementById("sponsorSkipNotice" + this.idSuffix);
|
||||
if (notice != null) {
|
||||
notice.remove();
|
||||
}
|
||||
|
||||
//remove setInterval
|
||||
if (this.countdownInterval != -1) clearInterval(this.countdownInterval);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user