mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-14 23:47:04 +03:00
Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fad3284c4f | ||
|
|
c69047c7f9 | ||
|
|
4fc7a69dd5 | ||
|
|
dd4c903c6a | ||
|
|
c9a2edaf3d | ||
|
|
8d41af073d | ||
|
|
bfafcd07cc | ||
|
|
77abc1d031 | ||
|
|
809de0e0fd | ||
|
|
e55d1f5115 | ||
|
|
037bd511b0 | ||
|
|
1265eeb941 | ||
|
|
b3a94142c3 | ||
|
|
367657e44e | ||
|
|
955ee32b46 | ||
|
|
cd0b1f4a31 | ||
|
|
5c4f0c960c | ||
|
|
5ac6dd1a7f | ||
|
|
8d53e776b8 | ||
|
|
ec2950786f | ||
|
|
f33fa2f621 | ||
|
|
fd77748b15 | ||
|
|
3b59389cab | ||
|
|
e6f53a3ef9 | ||
|
|
b2f1a737f5 | ||
|
|
e2c7f4d16f | ||
|
|
4a89dfaac5 | ||
|
|
e47330a79c | ||
|
|
72fc3620bc | ||
|
|
0ebd7f4f8d | ||
|
|
beea8181a1 | ||
|
|
f0716e8bbb | ||
|
|
783ea5cf5b | ||
|
|
42a813d325 | ||
|
|
e6dfb5041e | ||
|
|
c857308038 | ||
|
|
f73abdbabc | ||
|
|
43184e466f | ||
|
|
627c7769b0 | ||
|
|
759dba9cd3 | ||
|
|
7cac2c4045 | ||
|
|
27bb44189f | ||
|
|
4c44f3da25 | ||
|
|
e917a3e94a | ||
|
|
1570bfdd0a | ||
|
|
e511de9f88 | ||
|
|
e694393edc | ||
|
|
e1cb86e6b4 | ||
|
|
22221ba9bd | ||
|
|
9ad67c1a03 | ||
|
|
53071a9291 | ||
|
|
56e40b791f | ||
|
|
93316bf463 | ||
|
|
3f98e2fc73 | ||
|
|
9f4fec2a43 | ||
|
|
89cc6ed184 | ||
|
|
730d966019 | ||
|
|
c509b8807c | ||
|
|
7de907fa23 | ||
|
|
b4e03ae055 | ||
|
|
c9460bd6c6 | ||
|
|
d9800b3c14 | ||
|
|
fa7f577177 | ||
|
|
ca2727655e |
11
README.md
11
README.md
@@ -11,18 +11,21 @@
|
|||||||
<b>Download:</b>
|
<b>Download:</b>
|
||||||
<a href="https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone">Chrome/Chromium</a> |
|
<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://addons.mozilla.org/addon/sponsorblock/?src=external-github">Firefox</a> |
|
||||||
|
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Android">Android</a> |
|
||||||
<a href="https://sponsor.ajay.app">Website</a> |
|
<a href="https://sponsor.ajay.app">Website</a> |
|
||||||
<a href="https://sponsor.ajay.app/stats">Stats</a>
|
<a href="https://sponsor.ajay.app/stats">Stats</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<b>Unofficial Ports:</b>
|
<b>Unofficial Ports:</b>
|
||||||
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#mpv-media-player">MPV</a>
|
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#mpv-media-player">MPV</a> |
|
||||||
|
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#kodi">Kodi</a> |
|
||||||
|
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#ios">iOS</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<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://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://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone"><img src="https://img.shields.io/chrome-web-store/users/mnjggcdmjocbbbhaepdhchncahnbgone?label=Chrome%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=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=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>
|
<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>
|
||||||
@@ -32,7 +35,7 @@
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Also support Invidio.us.
|
Also supports Invidio.us.
|
||||||
|
|
||||||
**Translate:** [](https://crowdin.com/project/sponsorblock)
|
**Translate:** [](https://crowdin.com/project/sponsorblock)
|
||||||
|
|
||||||
@@ -46,7 +49,7 @@ The backend server code is available here: https://github.com/ajayyy/SponsorBloc
|
|||||||
|
|
||||||
It is a simple SQLite database that will hold all the timing data.
|
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. If you are planning on using the database in another project, please read the [API Docs](https://github.com/ajayyy/SponsorBlock/wiki/API-Docs) page for more information.
|
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database.db ([License](https://github.com/ajayyy/SponsorBlock/wiki/Database-and-API-License)). If you are planning on using the database in another project, please read the [API Docs](https://github.com/ajayyy/SponsorBlock/wiki/API-Docs) page for more information.
|
||||||
|
|
||||||
The dataset and API are now being used in some [ports](https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports) as well as a [neural network](https://github.com/andrewzlee/NeuralBlock).
|
The dataset and API are now being used in some [ports](https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports) as well as a [neural network](https://github.com/andrewzlee/NeuralBlock).
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "__MSG_fullName__",
|
"name": "__MSG_fullName__",
|
||||||
"short_name": "__MSG_Name__",
|
"short_name": "SponsorBlock",
|
||||||
"version": "1.2.30",
|
"version": "2.0.3",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"description": "__MSG_Description__",
|
"description": "__MSG_Description__",
|
||||||
"content_scripts": [{
|
"content_scripts": [{
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
"icons/downvote.png",
|
"icons/downvote.png",
|
||||||
"icons/thumbs_down.svg",
|
"icons/thumbs_down.svg",
|
||||||
"icons/thumbs_up.svg",
|
"icons/thumbs_up.svg",
|
||||||
|
"icons/help.svg",
|
||||||
"icons/report.png",
|
"icons/report.png",
|
||||||
"icons/close.png",
|
"icons/close.png",
|
||||||
"icons/beep.ogg",
|
"icons/beep.ogg",
|
||||||
@@ -49,7 +50,7 @@
|
|||||||
"*://*/*"
|
"*://*/*"
|
||||||
],
|
],
|
||||||
"browser_action": {
|
"browser_action": {
|
||||||
"default_title": "__MSG_Name__",
|
"default_title": "SponsorBlock",
|
||||||
"default_popup": "popup.html"
|
"default_popup": "popup.html"
|
||||||
},
|
},
|
||||||
"background": {
|
"background": {
|
||||||
|
|||||||
@@ -95,9 +95,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Гласувано!"
|
"message": "Гласувано!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Вече сте гласували така преди."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Възникна грешка с връзката. Код на грешката: "
|
"message": "Възникна грешка с връзката. Код на грешката: "
|
||||||
},
|
},
|
||||||
@@ -127,5 +124,29 @@
|
|||||||
},
|
},
|
||||||
"voteOnTime": {
|
"voteOnTime": {
|
||||||
"message": "Гласуване за спонсорства"
|
"message": "Гласуване за спонсорства"
|
||||||
|
},
|
||||||
|
"savedPeopleFrom": {
|
||||||
|
"message": "Вие сте помогнали на хора да пропуснат "
|
||||||
|
},
|
||||||
|
"viewLeaderboard": {
|
||||||
|
"message": "Вижте leaderboard-а"
|
||||||
|
},
|
||||||
|
"here": {
|
||||||
|
"message": "тук"
|
||||||
|
},
|
||||||
|
"discordAdvert": {
|
||||||
|
"message": "Елате в официалния Discord сървър за да давате предложения!"
|
||||||
|
},
|
||||||
|
"hideThis": {
|
||||||
|
"message": "Скрий това"
|
||||||
|
},
|
||||||
|
"Options": {
|
||||||
|
"message": "Настройки"
|
||||||
|
},
|
||||||
|
"showButtons": {
|
||||||
|
"message": "Показване на бутоните в YouTube Player-а"
|
||||||
|
},
|
||||||
|
"hideButtons": {
|
||||||
|
"message": "Скриване на бутоните в YouTube Player-а"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,11 +33,17 @@
|
|||||||
"message": "gesponsorter Inhalt"
|
"message": "gesponsorter Inhalt"
|
||||||
},
|
},
|
||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "gesponsorte Inhalte"
|
"message": "gesponserten Inhalten"
|
||||||
|
},
|
||||||
|
"upvoteButtonInfo": {
|
||||||
|
"message": "Diesen Beitrag aufwerten"
|
||||||
},
|
},
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Melden"
|
"message": "Melden"
|
||||||
},
|
},
|
||||||
|
"reportButtonInfo": {
|
||||||
|
"message": "Beitrag als unzulässig melden."
|
||||||
|
},
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Abbrechen"
|
"message": "Abbrechen"
|
||||||
},
|
},
|
||||||
@@ -98,8 +104,8 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Abgestimmt!"
|
"message": "Abgestimmt!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
"serverDown": {
|
||||||
"message": "Du hast bereits so abgestimmt."
|
"message": "Der Server ist scheinbar offline. Bitte unverzüglich dem Entwickler melden."
|
||||||
},
|
},
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
|
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
|
||||||
@@ -477,35 +483,82 @@
|
|||||||
"category_sponsor": {
|
"category_sponsor": {
|
||||||
"message": "Sponsor"
|
"message": "Sponsor"
|
||||||
},
|
},
|
||||||
|
"category_sponsor_description": {
|
||||||
|
"message": "Bezahlte Promotion, bezahlte Empfehlungen und direkte Werbung. Nicht für Selbstpromotion oder kostenlose Shoutouts an Ursachen/Webseiten/Produkte, die sie mögen."
|
||||||
|
},
|
||||||
"category_intro": {
|
"category_intro": {
|
||||||
"message": "Intro Animation"
|
"message": "Intro Animation"
|
||||||
},
|
},
|
||||||
|
"category_intro_description": {
|
||||||
|
"message": "Intro Animationen, die in der Serie wiederholt werden oder keinen direkten Wert haben. Dies sollte nicht für Musikvideos verwendet werden."
|
||||||
|
},
|
||||||
|
"category_intro_short": {
|
||||||
|
"message": "Intro"
|
||||||
|
},
|
||||||
"category_outro": {
|
"category_outro": {
|
||||||
"message": "Endkarten/Credits"
|
"message": "Endkarten/Credits"
|
||||||
},
|
},
|
||||||
|
"category_outro_description": {
|
||||||
|
"message": "Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für gesprochene Fazits. Dies sollte keine nützlichen Inhalte beinhalten. Dies sollte nicht für Musikvideos verwendet werden."
|
||||||
|
},
|
||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "Interaktions-Erinnerung (Abonnieren)"
|
"message": "Interaktions-Erinnerung (Abonnieren)"
|
||||||
},
|
},
|
||||||
|
"category_interaction_description": {
|
||||||
|
"message": "Wenn es eine kurze Erinnerung gibt, zu abonnieren oder zu folgen in der Mitte des Videos. Wenn es lange ist oder etwas Konkretes ist, sollte es stattdessen unter Selbstpromotion stehen."
|
||||||
|
},
|
||||||
|
"category_interaction_short": {
|
||||||
|
"message": "Interaktions-Erinnerung"
|
||||||
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "Eigenwerbung und Merchandise"
|
"message": "Unbezahlt/Eigenwerbung"
|
||||||
|
},
|
||||||
|
"category_selfpromo_description": {
|
||||||
|
"message": "Ähnlich wie bei \"Sponsor\" mit Ausnahme von unbezahlten oder Selbstpromotion. Dies beinhaltet Abschnitte über Waren, Spenden oder Informationen darüber, mit wem sie zusammengearbeitet haben."
|
||||||
},
|
},
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Musik: Nicht-Musik-Abschnitt"
|
"message": "Musik: Nicht-Musik-Abschnitt"
|
||||||
},
|
},
|
||||||
|
"category_music_offtopic_description": {
|
||||||
|
"message": "Nur für den Einsatz in Musikvideos. Dies beinhaltet Einführungen oder Outros in Musikvideos."
|
||||||
|
},
|
||||||
|
"category_music_offtopic_short": {
|
||||||
|
"message": "Nicht-Musik"
|
||||||
|
},
|
||||||
"category_livestream_messages": {
|
"category_livestream_messages": {
|
||||||
"message": "Livestream: Spenden/Nachrichten vorlesen"
|
"message": "Livestream: Spenden/Nachrichten vorlesen"
|
||||||
},
|
},
|
||||||
|
"category_livestream_messages_short": {
|
||||||
|
"message": "Nachrichten lesen"
|
||||||
|
},
|
||||||
"disable": {
|
"disable": {
|
||||||
"message": "Deaktivieren"
|
"message": "Deaktivieren"
|
||||||
},
|
},
|
||||||
"manualSkip": {
|
"manualSkip": {
|
||||||
"message": "Manueller Überspringen"
|
"message": "Manuelles Überspringen"
|
||||||
},
|
},
|
||||||
"showOverlay": {
|
"showOverlay": {
|
||||||
"message": "Vor-/Rücklaufleiste anzeigen"
|
"message": "Vor-/Rücklaufleiste anzeigen"
|
||||||
},
|
},
|
||||||
|
"colorFormatIncorrect": {
|
||||||
|
"message": "Ihre Farbe ist falsch formatiert. Sie sollte ein 3-6-stelliger Hex-Code mit einem Zahlenzeichen am Anfang sein."
|
||||||
|
},
|
||||||
|
"previewColor": {
|
||||||
|
"message": "Vorschau Farbe",
|
||||||
|
"description": "Referring to submissions that have not been sent to the server yet."
|
||||||
|
},
|
||||||
|
"seekBarColor": {
|
||||||
|
"message": "Suchleisten-Farbe"
|
||||||
|
},
|
||||||
|
"category": {
|
||||||
|
"message": "Kategorie"
|
||||||
|
},
|
||||||
|
"skipOption": {
|
||||||
|
"message": "Option zum Überspringen",
|
||||||
|
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||||
|
},
|
||||||
"enableTestingServer": {
|
"enableTestingServer": {
|
||||||
"message": "Beta Testing Server aktivieren"
|
"message": "Beta-Testing Server aktivieren"
|
||||||
},
|
},
|
||||||
"whatEnableTestingServer": {
|
"whatEnableTestingServer": {
|
||||||
"message": "Deine Einreichungen und Stimmen werden NICHT für den Hauptserver geltend. Benutze dies nur für Tests."
|
"message": "Deine Einreichungen und Stimmen werden NICHT für den Hauptserver geltend. Benutze dies nur für Tests."
|
||||||
@@ -532,7 +585,7 @@
|
|||||||
"message": "Kanal-ID wurde noch nicht geladen."
|
"message": "Kanal-ID wurde noch nicht geladen."
|
||||||
},
|
},
|
||||||
"adblockerIssue": {
|
"adblockerIssue": {
|
||||||
"message": "Irgendwas hält SponsorBlock davon ab, die Videodaten abzurufen. Möglicherweise ist das dein Werbeblocker. Mehr Infos: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
"message": "Irgendetwas hält SponsorBlock davon ab, die Videodaten abzurufen. Möglicherweise ist es dein Werbeblocker. Mehr Infos: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
},
|
},
|
||||||
"itCouldBeAdblockerIssue": {
|
"itCouldBeAdblockerIssue": {
|
||||||
"message": "Falls dies weiterhin geschieht, könnte dies durch Ihren Werbeblocker verursacht werden. Bitte überprüfen Sie https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
"message": "Falls dies weiterhin geschieht, könnte dies durch Ihren Werbeblocker verursacht werden. Bitte überprüfen Sie https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
@@ -554,5 +607,27 @@
|
|||||||
},
|
},
|
||||||
"nonMusicCategoryOnMusic": {
|
"nonMusicCategoryOnMusic": {
|
||||||
"message": "Dieses Video ist als Musik kategorisiert. Sind Sie sicher, dass Sie Segmente mit Nicht-Musikkategorien einreichen möchten? Wenn dieses Video nicht wirklich Musik ist, sollten Sie dieses Segment nicht einreichen. Bitte lesen Sie die Richtlinien, wenn Sie verwirrt sind."
|
"message": "Dieses Video ist als Musik kategorisiert. Sind Sie sicher, dass Sie Segmente mit Nicht-Musikkategorien einreichen möchten? Wenn dieses Video nicht wirklich Musik ist, sollten Sie dieses Segment nicht einreichen. Bitte lesen Sie die Richtlinien, wenn Sie verwirrt sind."
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Mehrere Segmente"
|
||||||
|
},
|
||||||
|
"guidelines": {
|
||||||
|
"message": "Richtlinien"
|
||||||
|
},
|
||||||
|
"readTheGuidelines": {
|
||||||
|
"message": "Lesen Sie die Richtlinien!!",
|
||||||
|
"description": "Show the first time they submit or if they are \"high risk\""
|
||||||
|
},
|
||||||
|
"categoryUpdate1": {
|
||||||
|
"message": "Kategorien sind hier!"
|
||||||
|
},
|
||||||
|
"categoryUpdate2": {
|
||||||
|
"message": "Öffnen Sie die Optionen um Intros, Outros, Merch usw. zu überspringen."
|
||||||
|
},
|
||||||
|
"unsubmittedWarning": {
|
||||||
|
"message": "Nicht eingereichte Segment-Benachrichtigung"
|
||||||
|
},
|
||||||
|
"unsubmittedWarningDescription": {
|
||||||
|
"message": "Senden Sie eine Benachrichtigung, wenn Sie ein Video mit nicht hochgeladenen Segmenten verlassen"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
{
|
{
|
||||||
"Name": {
|
|
||||||
"message": "SponsorBlock",
|
|
||||||
"description": "Name of the extension."
|
|
||||||
},
|
|
||||||
"fullName": {
|
"fullName": {
|
||||||
"message": "SponsorBlock for YouTube - Skip Sponsorships",
|
"message": "SponsorBlock for YouTube - Skip Sponsorships",
|
||||||
"description": "Name of the extension."
|
"description": "Name of the extension."
|
||||||
@@ -222,7 +218,7 @@
|
|||||||
"message": "Show Notice Again"
|
"message": "Show Notice Again"
|
||||||
},
|
},
|
||||||
"longDescription": {
|
"longDescription": {
|
||||||
"message": "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.",
|
"message": "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. \n\n You can also skip intros, outros, reminders to subscribe and other categories.",
|
||||||
"description": "Full description of the extension on the store pages."
|
"description": "Full description of the extension on the store pages."
|
||||||
},
|
},
|
||||||
"website": {
|
"website": {
|
||||||
@@ -293,6 +289,12 @@
|
|||||||
"audioNotificationDescription": {
|
"audioNotificationDescription": {
|
||||||
"message": "Audio notification on skip will play a sound whenever a sponsor is skipped. If disabled (or auto skip is disabled), no sound will be played."
|
"message": "Audio notification on skip will play a sound whenever a sponsor is skipped. If disabled (or auto skip is disabled), no sound will be played."
|
||||||
},
|
},
|
||||||
|
"showTimeWithSkips": {
|
||||||
|
"message": "Show Time With Skips Removed"
|
||||||
|
},
|
||||||
|
"showTimeWithSkipsDescription": {
|
||||||
|
"message": "This time appears in brackets next to the current time on below the seekbar. This shows the total video duration minus any segments. This includes segments marked as only \"Show In Seekbar\"."
|
||||||
|
},
|
||||||
"youHaveSkipped": {
|
"youHaveSkipped": {
|
||||||
"message": "You have skipped "
|
"message": "You have skipped "
|
||||||
},
|
},
|
||||||
@@ -470,9 +472,6 @@
|
|||||||
"theKey": {
|
"theKey": {
|
||||||
"message": "The key"
|
"message": "The key"
|
||||||
},
|
},
|
||||||
"keyAlreadyUsedByYouTube": {
|
|
||||||
"message": "is already used by youtube. Please select another key."
|
|
||||||
},
|
|
||||||
"keyAlreadyUsed": {
|
"keyAlreadyUsed": {
|
||||||
"message": "is bound to another action. Please select another key."
|
"message": "is bound to another action. Please select another key."
|
||||||
},
|
},
|
||||||
@@ -483,24 +482,54 @@
|
|||||||
"category_sponsor": {
|
"category_sponsor": {
|
||||||
"message": "Sponsor"
|
"message": "Sponsor"
|
||||||
},
|
},
|
||||||
|
"category_sponsor_description": {
|
||||||
|
"message": "Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like."
|
||||||
|
},
|
||||||
"category_intro": {
|
"category_intro": {
|
||||||
"message": "Intro Animation"
|
"message": "Intermission/Intro Animation"
|
||||||
|
},
|
||||||
|
"category_intro_description": {
|
||||||
|
"message": "An interval without actual content. Could be a pause, static frame, repeating animation. This should not be used for transitions containing information or be used on music videos."
|
||||||
|
},
|
||||||
|
"category_intro_short": {
|
||||||
|
"message": "Intermission"
|
||||||
},
|
},
|
||||||
"category_outro": {
|
"category_outro": {
|
||||||
"message": "Endcards/Credits"
|
"message": "Endcards/Credits"
|
||||||
},
|
},
|
||||||
|
"category_outro_description": {
|
||||||
|
"message": "Credits or when the YouTube endcards appear. Not for spoken conclusions. This should not include useful content. This should not be used on music videos."
|
||||||
|
},
|
||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "Interaction Reminder (Subscribe)"
|
"message": "Interaction Reminder (Subscribe)"
|
||||||
},
|
},
|
||||||
|
"category_interaction_description": {
|
||||||
|
"message": "When there is a short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should be under self promotion instead."
|
||||||
|
},
|
||||||
|
"category_interaction_short": {
|
||||||
|
"message": "Interaction Reminder"
|
||||||
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "Unpaid/Self Promotion"
|
"message": "Unpaid/Self Promotion"
|
||||||
},
|
},
|
||||||
|
"category_selfpromo_description": {
|
||||||
|
"message": "Similar to \"sponsor\" except for unpaid or self promotion. This includes sections about merchandise, donations, or information about who they collaborated with."
|
||||||
|
},
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Music: Non-Music Section"
|
"message": "Music: Non-Music Section"
|
||||||
},
|
},
|
||||||
|
"category_music_offtopic_description": {
|
||||||
|
"message": "Only for use in music videos. This includes introductions or outros in music videos."
|
||||||
|
},
|
||||||
|
"category_music_offtopic_short": {
|
||||||
|
"message": "Non-Music"
|
||||||
|
},
|
||||||
"category_livestream_messages": {
|
"category_livestream_messages": {
|
||||||
"message": "Livestream: Donation/Message Readings"
|
"message": "Livestream: Donation/Message Readings"
|
||||||
},
|
},
|
||||||
|
"category_livestream_messages_short": {
|
||||||
|
"message": "Message Reading"
|
||||||
|
},
|
||||||
"disable": {
|
"disable": {
|
||||||
"message": "Disable"
|
"message": "Disable"
|
||||||
},
|
},
|
||||||
@@ -510,6 +539,23 @@
|
|||||||
"showOverlay": {
|
"showOverlay": {
|
||||||
"message": "Show In Seek Bar"
|
"message": "Show In Seek Bar"
|
||||||
},
|
},
|
||||||
|
"colorFormatIncorrect": {
|
||||||
|
"message": "Your color is formatted incorrectly. It should be a 3 or 6 digit hex code with a number sign at the beginning."
|
||||||
|
},
|
||||||
|
"previewColor": {
|
||||||
|
"message": "Preview Color",
|
||||||
|
"description": "Referring to submissions that have not been sent to the server yet."
|
||||||
|
},
|
||||||
|
"seekBarColor": {
|
||||||
|
"message": "Seek Bar Color"
|
||||||
|
},
|
||||||
|
"category": {
|
||||||
|
"message": "Category"
|
||||||
|
},
|
||||||
|
"skipOption": {
|
||||||
|
"message": "Skip Option",
|
||||||
|
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||||
|
},
|
||||||
"enableTestingServer": {
|
"enableTestingServer": {
|
||||||
"message": "Enable Beta Testing Server"
|
"message": "Enable Beta Testing Server"
|
||||||
},
|
},
|
||||||
@@ -563,5 +609,24 @@
|
|||||||
},
|
},
|
||||||
"multipleSegments": {
|
"multipleSegments": {
|
||||||
"message": "Multiple Segments"
|
"message": "Multiple Segments"
|
||||||
|
},
|
||||||
|
"guidelines": {
|
||||||
|
"message": "Guidelines"
|
||||||
|
},
|
||||||
|
"readTheGuidelines": {
|
||||||
|
"message": "Read The Guidelines!!",
|
||||||
|
"description": "Show the first time they submit or if they are \"high risk\""
|
||||||
|
},
|
||||||
|
"categoryUpdate1": {
|
||||||
|
"message": "Categories are here!"
|
||||||
|
},
|
||||||
|
"categoryUpdate2": {
|
||||||
|
"message": "Open the options to skip intros, outros, merch, etc."
|
||||||
|
},
|
||||||
|
"unsubmittedWarning": {
|
||||||
|
"message": "Unsubmitted Segments Notification"
|
||||||
|
},
|
||||||
|
"unsubmittedWarningDescription": {
|
||||||
|
"message": "Send a notification when you leave a video with segments that are not uploaded"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -458,9 +458,6 @@
|
|||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "Recordatorio de interacción (subscribir)"
|
"message": "Recordatorio de interacción (subscribir)"
|
||||||
},
|
},
|
||||||
"category_selfpromo": {
|
|
||||||
"message": "Auto-promoción y mercancía"
|
|
||||||
},
|
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Música: Sección sin musica"
|
"message": "Música: Sección sin musica"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -101,9 +101,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Äänestetty!"
|
"message": "Äänestetty!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Olet jo äänestänyt näin aiemmin."
|
|
||||||
},
|
|
||||||
"serverDown": {
|
"serverDown": {
|
||||||
"message": "Palvelin näyttää olevan alhaalla. Ota heti yhteyttä kehittäjään."
|
"message": "Palvelin näyttää olevan alhaalla. Ota heti yhteyttä kehittäjään."
|
||||||
},
|
},
|
||||||
@@ -339,9 +336,6 @@
|
|||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "Vuorovaikutusmuistutus (tilaaminen)"
|
"message": "Vuorovaikutusmuistutus (tilaaminen)"
|
||||||
},
|
},
|
||||||
"category_selfpromo": {
|
|
||||||
"message": "Itsepromootio ja fanituotteet"
|
|
||||||
},
|
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Musiikki: muussa kuin Musiikki-osiossa"
|
"message": "Musiikki: muussa kuin Musiikki-osiossa"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -81,10 +81,10 @@
|
|||||||
"message": "Êtes-vous certain(e) de vouloir supprimer vos soumissions ?\n\n"
|
"message": "Êtes-vous certain(e) de vouloir supprimer vos soumissions ?\n\n"
|
||||||
},
|
},
|
||||||
"Unknown": {
|
"Unknown": {
|
||||||
"message": "Une erreur s'est produite lors de la soumission, veuillez ré-essayer plus tard."
|
"message": "Une erreur s'est produite lors de la soumission, veuillez réessayer plus tard."
|
||||||
},
|
},
|
||||||
"sponsorFound": {
|
"sponsorFound": {
|
||||||
"message": "Les messages commerciaux pour cette vidéo sont déjà dans notre base de donnée !"
|
"message": "Les messages commerciaux pour cette vidéo sont déjà dans notre base de données !"
|
||||||
},
|
},
|
||||||
"sponsor404": {
|
"sponsor404": {
|
||||||
"message": "Pas de messages commerciaux trouvés"
|
"message": "Pas de messages commerciaux trouvés"
|
||||||
@@ -104,9 +104,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "A voté !"
|
"message": "A voté !"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Vous avez déjà voté pour ce choix."
|
|
||||||
},
|
|
||||||
"serverDown": {
|
"serverDown": {
|
||||||
"message": "Le serveur ne fonctionne pas. Contactez le développeur."
|
"message": "Le serveur ne fonctionne pas. Contactez le développeur."
|
||||||
},
|
},
|
||||||
@@ -171,10 +168,10 @@
|
|||||||
"message": "Soumettre les temps"
|
"message": "Soumettre les temps"
|
||||||
},
|
},
|
||||||
"publicStats": {
|
"publicStats": {
|
||||||
"message": "Affiché sur le classement public pour montrer vos contributions. Voir sur"
|
"message": "Votre pseudo est inscrit dans le classement public pour afficher vos contributions. Le consulter"
|
||||||
},
|
},
|
||||||
"setUsername": {
|
"setUsername": {
|
||||||
"message": "Choisir pseudo"
|
"message": "Choisir un pseudonyme"
|
||||||
},
|
},
|
||||||
"discordAdvert": {
|
"discordAdvert": {
|
||||||
"message": "Rejoignez le serveur Discord officiel pour toutes suggestions ou remarques!"
|
"message": "Rejoignez le serveur Discord officiel pour toutes suggestions ou remarques!"
|
||||||
@@ -300,7 +297,7 @@
|
|||||||
"message": "Vous avez passé "
|
"message": "Vous avez passé "
|
||||||
},
|
},
|
||||||
"youHaveSaved": {
|
"youHaveSaved": {
|
||||||
"message": "Vous avez économisé "
|
"message": "Vous vous êtes économisé "
|
||||||
},
|
},
|
||||||
"minLower": {
|
"minLower": {
|
||||||
"message": "minute"
|
"message": "minute"
|
||||||
@@ -345,13 +342,13 @@
|
|||||||
"message": "Passage automatique"
|
"message": "Passage automatique"
|
||||||
},
|
},
|
||||||
"showSkipNotice": {
|
"showSkipNotice": {
|
||||||
"message": "Afficher l'avis après le passage d'un sponsor"
|
"message": "Notifier après qu'un sponsor ait été sauté"
|
||||||
},
|
},
|
||||||
"keybindCurrentlySet": {
|
"keybindCurrentlySet": {
|
||||||
"message": ". Il est actuellement réglé sur :"
|
"message": ". Il est actuellement réglé sur :"
|
||||||
},
|
},
|
||||||
"supportInvidious": {
|
"supportInvidious": {
|
||||||
"message": "Soutenir Invidious"
|
"message": "Supporter Invidious"
|
||||||
},
|
},
|
||||||
"supportInvidiousDescription": {
|
"supportInvidiousDescription": {
|
||||||
"message": "Invidious (invidio.us) est un client tiers pour YouTube. Vous devez accepter des permissions supplémentaires pour activer son support. Cette fonctionnalité ne fonctionne pas en mode incognito sur Chrome et les autres variantes de Chromium."
|
"message": "Invidious (invidio.us) est un client tiers pour YouTube. Vous devez accepter des permissions supplémentaires pour activer son support. Cette fonctionnalité ne fonctionne pas en mode incognito sur Chrome et les autres variantes de Chromium."
|
||||||
@@ -486,21 +483,48 @@
|
|||||||
"category_sponsor": {
|
"category_sponsor": {
|
||||||
"message": "Message commercial"
|
"message": "Message commercial"
|
||||||
},
|
},
|
||||||
|
"category_sponsor_description": {
|
||||||
|
"message": "Promotion rémunérée, parrainage rémunéré et publicité directe. Pas pour l'autopromotion ou les présentations gratuites de causes, de créateurs, de sites web ou de produits qu'ils aiment."
|
||||||
|
},
|
||||||
"category_intro": {
|
"category_intro": {
|
||||||
"message": "Générique d'introduction"
|
"message": "Générique d'introduction"
|
||||||
},
|
},
|
||||||
|
"category_intro_description": {
|
||||||
|
"message": "Introductions animées qui sont récurrentes ou qui n'ont pas de valeur ajoutée directe dans la série. Ne doit pas être utilisé pour les vidéos musicales."
|
||||||
|
},
|
||||||
|
"category_intro_short": {
|
||||||
|
"message": "Introduction"
|
||||||
|
},
|
||||||
"category_outro": {
|
"category_outro": {
|
||||||
"message": "Générique de fin"
|
"message": "Générique de fin"
|
||||||
},
|
},
|
||||||
|
"category_outro_description": {
|
||||||
|
"message": "Générique de fin ou quand les fiches de fin de vidéo apparaissent. Ne pas utiliser pour les conclusions orales. Ne doit pas inclure de contenu utile. Ne pas utiliser sur les vidéos de musique."
|
||||||
|
},
|
||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "Rappel d'interaction (abonnement)"
|
"message": "Rappel d'interaction (abonnement)"
|
||||||
},
|
},
|
||||||
|
"category_interaction_description": {
|
||||||
|
"message": "Lorsqu'il y a un bref rappel pour liker, s'abonner ou les follow parmi le contenu. Si le message est long ou porte sur quelque chose de spécifique, cela devrait plutôt être classé comme une autopromotion."
|
||||||
|
},
|
||||||
|
"category_interaction_short": {
|
||||||
|
"message": "Rappel d'interaction"
|
||||||
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "Auto-promotion et produits dérivés"
|
"message": "Non rémunéré/autopromotion"
|
||||||
|
},
|
||||||
|
"category_selfpromo_description": {
|
||||||
|
"message": "Semblable au \"sponsor\", excepté pour la promotion non rémunérée ou l'auto-promotion. Cela inclut les marchandises, les dons et les informations sur leurs collaborateurs."
|
||||||
},
|
},
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Musique : Segment non-musicale"
|
"message": "Musique : Segment non-musicale"
|
||||||
},
|
},
|
||||||
|
"category_music_offtopic_description": {
|
||||||
|
"message": "A utiliser uniquement dans les vidéos musicales. Cela inclut les introductions ou les fins dans les vidéos."
|
||||||
|
},
|
||||||
|
"category_music_offtopic_short": {
|
||||||
|
"message": "Hors musique"
|
||||||
|
},
|
||||||
"category_livestream_messages": {
|
"category_livestream_messages": {
|
||||||
"message": "Stream : lecture de dons et messages"
|
"message": "Stream : lecture de dons et messages"
|
||||||
},
|
},
|
||||||
@@ -513,6 +537,23 @@
|
|||||||
"showOverlay": {
|
"showOverlay": {
|
||||||
"message": "Afficher dans la barre de progression"
|
"message": "Afficher dans la barre de progression"
|
||||||
},
|
},
|
||||||
|
"colorFormatIncorrect": {
|
||||||
|
"message": "Votre couleur est mal formatée. Il devrait s'agir d'un code hexadécimal à 3 ou 6 chiffres avec un signe numérique au début."
|
||||||
|
},
|
||||||
|
"previewColor": {
|
||||||
|
"message": "Couleur en mode aperçu",
|
||||||
|
"description": "Referring to submissions that have not been sent to the server yet."
|
||||||
|
},
|
||||||
|
"seekBarColor": {
|
||||||
|
"message": "Couleur dans la barre de progression"
|
||||||
|
},
|
||||||
|
"category": {
|
||||||
|
"message": "Catégorie"
|
||||||
|
},
|
||||||
|
"skipOption": {
|
||||||
|
"message": "Option de saut",
|
||||||
|
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||||
|
},
|
||||||
"enableTestingServer": {
|
"enableTestingServer": {
|
||||||
"message": "Activer le serveur de test bêta"
|
"message": "Activer le serveur de test bêta"
|
||||||
},
|
},
|
||||||
@@ -566,5 +607,24 @@
|
|||||||
},
|
},
|
||||||
"multipleSegments": {
|
"multipleSegments": {
|
||||||
"message": "Plusieurs segments"
|
"message": "Plusieurs segments"
|
||||||
|
},
|
||||||
|
"guidelines": {
|
||||||
|
"message": "Instructions"
|
||||||
|
},
|
||||||
|
"readTheGuidelines": {
|
||||||
|
"message": "Lisez les instructions !!",
|
||||||
|
"description": "Show the first time they submit or if they are \"high risk\""
|
||||||
|
},
|
||||||
|
"categoryUpdate1": {
|
||||||
|
"message": "Les catégories sont là !"
|
||||||
|
},
|
||||||
|
"categoryUpdate2": {
|
||||||
|
"message": "Ouvrir les options pour sauter les intros, outros, marchandises, etc."
|
||||||
|
},
|
||||||
|
"unsubmittedWarning": {
|
||||||
|
"message": "Notification de segments non soumis"
|
||||||
|
},
|
||||||
|
"unsubmittedWarningDescription": {
|
||||||
|
"message": "Envoyer une notification lorsque vous quittez une vidéo avec des segments qui ne sont pas téléversés"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
{
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
"Loading": {
|
"Loading": {
|
||||||
"message": "Betöltés..."
|
"message": "Betöltés..."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -91,9 +91,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Votato!"
|
"message": "Votato!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Hai già votato."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Si è verificato un errore durante la connessione. Codice errore: "
|
"message": "Si è verificato un errore durante la connessione. Codice errore: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,15 +11,39 @@
|
|||||||
"message": "Sla sponsoring over op YouTube video's. Rapporteer sponsors van video's die je bekijkt om tijd van anderen te besparen.",
|
"message": "Sla sponsoring over op YouTube video's. Rapporteer sponsors van video's die je bekijkt om tijd van anderen te besparen.",
|
||||||
"description": "Description of the extension."
|
"description": "Description of the extension."
|
||||||
},
|
},
|
||||||
|
"400": {
|
||||||
|
"message": "Server zegt dat het verzoek ongeldig is"
|
||||||
|
},
|
||||||
|
"429": {
|
||||||
|
"message": "Je hebt te veel sponsortijden voor deze video doorgegeven, weet je zeker dat het er zo veel zijn?"
|
||||||
|
},
|
||||||
|
"409": {
|
||||||
|
"message": "Dit is al een keer ingediend"
|
||||||
|
},
|
||||||
|
"channelWhitelisted": {
|
||||||
|
"message": "Kanaal gewhitelist!"
|
||||||
|
},
|
||||||
"Sponsor": {
|
"Sponsor": {
|
||||||
"message": "sponsor"
|
"message": "sponsor"
|
||||||
},
|
},
|
||||||
"Sponsors": {
|
"Sponsors": {
|
||||||
"message": "sponsoren"
|
"message": "sponsoren"
|
||||||
},
|
},
|
||||||
|
"Segment": {
|
||||||
|
"message": "Sponsor segment"
|
||||||
|
},
|
||||||
|
"Segments": {
|
||||||
|
"message": "Sponsor segmenten"
|
||||||
|
},
|
||||||
|
"upvoteButtonInfo": {
|
||||||
|
"message": "Stem op deze indiening"
|
||||||
|
},
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Melden"
|
"message": "Melden"
|
||||||
},
|
},
|
||||||
|
"reportButtonInfo": {
|
||||||
|
"message": "Rapporteer deze indiening als onjuist."
|
||||||
|
},
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Negeren"
|
"message": "Negeren"
|
||||||
},
|
},
|
||||||
@@ -35,9 +59,21 @@
|
|||||||
"Hide": {
|
"Hide": {
|
||||||
"message": "Nooit weergeven"
|
"message": "Nooit weergeven"
|
||||||
},
|
},
|
||||||
|
"hitGoBack": {
|
||||||
|
"message": "Druk op unskip om naar waar je vandaan komt te gaan."
|
||||||
|
},
|
||||||
|
"unskip": {
|
||||||
|
"message": "Unskip"
|
||||||
|
},
|
||||||
|
"reskip": {
|
||||||
|
"message": "Reskip"
|
||||||
|
},
|
||||||
"paused": {
|
"paused": {
|
||||||
"message": "Gepauzeerd"
|
"message": "Gepauzeerd"
|
||||||
},
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Timer gestopt"
|
||||||
|
},
|
||||||
"clearThis": {
|
"clearThis": {
|
||||||
"message": "Weet je zeker dat je dit formulier wilt wissen?\n\n"
|
"message": "Weet je zeker dat je dit formulier wilt wissen?\n\n"
|
||||||
},
|
},
|
||||||
@@ -59,9 +95,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Gestemd!"
|
"message": "Gestemd!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "U hebt al eerder op deze manier gestemd."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Er is een verbindingsfout opgetreden. Foutcode: "
|
"message": "Er is een verbindingsfout opgetreden. Foutcode: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -95,9 +95,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Zagłosowano!"
|
"message": "Zagłosowano!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Już na to głosowałeś."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Błąd z połączeniem. Kod błędu: "
|
"message": "Błąd z połączeniem. Kod błędu: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -72,7 +72,7 @@
|
|||||||
"message": "Tem certeza que quer limpar isso?\n\n"
|
"message": "Tem certeza que quer limpar isso?\n\n"
|
||||||
},
|
},
|
||||||
"Unknown": {
|
"Unknown": {
|
||||||
"message": "Teve um erro ao enviar seus segmentos, tente novamente depois."
|
"message": "Houve um erro ao enviar seus segmentos, tente novamente mais tarde."
|
||||||
},
|
},
|
||||||
"sponsorFound": {
|
"sponsorFound": {
|
||||||
"message": "Os patrocinadores desse vídeo estão no banco de dados!"
|
"message": "Os patrocinadores desse vídeo estão no banco de dados!"
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
"message": "Patrocínio termina agora"
|
"message": "Patrocínio termina agora"
|
||||||
},
|
},
|
||||||
"noVideoID": {
|
"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."
|
"message": "Nenhum vídeo do YouTube foi encontrado nesta aba. Se você sabe que esta é uma aba do YouTube, feche este pop-up e abra-o novamente. Se isso não funcionar, tente recarregar a aba."
|
||||||
},
|
},
|
||||||
"success": {
|
"success": {
|
||||||
"message": "Sucesso!"
|
"message": "Sucesso!"
|
||||||
@@ -95,17 +95,14 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Votado!"
|
"message": "Votado!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Você já votou antes."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Um erro de conexão aconteceu: Código: "
|
"message": "Ocorreu um erro de conexão. Código de erro: "
|
||||||
},
|
},
|
||||||
"wantToSubmit": {
|
"wantToSubmit": {
|
||||||
"message": "Quer enviar os segmentos para o vídeo de ID"
|
"message": "Quer enviar os segmentos para o vídeo de ID"
|
||||||
},
|
},
|
||||||
"leftTimes": {
|
"leftTimes": {
|
||||||
"message": "Parece que você se esqueceu de enviar alguns segmentos. Volta pra página para os enviar (não foram deletados)."
|
"message": "Parece que você se esqueceu de enviar alguns segmentos. Volte para aquela página para enviá-los (eles não foram deletados)."
|
||||||
},
|
},
|
||||||
"clearTimes": {
|
"clearTimes": {
|
||||||
"message": "Apagar intervalos dos patrocínios"
|
"message": "Apagar intervalos dos patrocínios"
|
||||||
@@ -114,25 +111,25 @@
|
|||||||
"message": "Abrir o Popup SponsorBlock"
|
"message": "Abrir o Popup SponsorBlock"
|
||||||
},
|
},
|
||||||
"SubmitTimes": {
|
"SubmitTimes": {
|
||||||
"message": "Submeter intervalos dos patrocínios"
|
"message": "Enviar intervalos de patrocínios"
|
||||||
},
|
},
|
||||||
"submitCheck": {
|
"submitCheck": {
|
||||||
"message": "Tem a certeza que pretende submeter?"
|
"message": "Você tem certeza que deseja enviar isto?"
|
||||||
},
|
},
|
||||||
"whitelistChannel": {
|
"whitelistChannel": {
|
||||||
"message": "Meter canal na Whitelist"
|
"message": "Colocar canal na lista branca"
|
||||||
},
|
},
|
||||||
"removeFromWhitelist": {
|
"removeFromWhitelist": {
|
||||||
"message": "Remover canal da Whitelist"
|
"message": "Remover canal da lista branca"
|
||||||
},
|
},
|
||||||
"voteOnTime": {
|
"voteOnTime": {
|
||||||
"message": "Vote num intervalo de patrocínio"
|
"message": "Vote num intervalo de patrocínio"
|
||||||
},
|
},
|
||||||
"recordTimes": {
|
"recordTimes": {
|
||||||
"message": "Registe um intervalo de patrocínio"
|
"message": "Grave os intervalos de um patrocínio"
|
||||||
},
|
},
|
||||||
"soFarUHSubmited": {
|
"soFarUHSubmited": {
|
||||||
"message": "Até agora submeteu"
|
"message": "Até agora, você já enviou"
|
||||||
},
|
},
|
||||||
"savedPeopleFrom": {
|
"savedPeopleFrom": {
|
||||||
"message": "Poupaste a outros de "
|
"message": "Poupaste a outros de "
|
||||||
@@ -144,10 +141,10 @@
|
|||||||
"message": "aqui"
|
"message": "aqui"
|
||||||
},
|
},
|
||||||
"recordTimesDescription": {
|
"recordTimesDescription": {
|
||||||
"message": "Clique no botão abaixo quando o patrocínio começar e quando terminar para registrar e submetê-lo à base de dados."
|
"message": "Clique no botão abaixo quando o patrocínio começa e termina para gravá-lo na base de dados."
|
||||||
},
|
},
|
||||||
"popupHint": {
|
"popupHint": {
|
||||||
"message": "Dica: Aperte a tecla ; enquanto reproduzir o vídeo para registar o começo/fim de um patrocínio e \" para enviar. (Essa configuração pode ser mudada em opções.)"
|
"message": "Dica: Aperte a tecla ponto e vírgula (;) com a janela focada em um vídeo para reportar o começo/fim de um patrocínio e aspas (\") para enviar. (Esta configuração pode ser mudada nas opções.)"
|
||||||
},
|
},
|
||||||
"lastTimes": {
|
"lastTimes": {
|
||||||
"message": "Últimos Intervalos de Patrocínios Seleciados"
|
"message": "Últimos Intervalos de Patrocínios Seleciados"
|
||||||
@@ -162,10 +159,10 @@
|
|||||||
"message": "Isso é usado na página pública de estatísticas que mostra o quanto você já contríbuíu. Veja-a"
|
"message": "Isso é usado na página pública de estatísticas que mostra o quanto você já contríbuíu. Veja-a"
|
||||||
},
|
},
|
||||||
"setUsername": {
|
"setUsername": {
|
||||||
"message": "Criar nomde de utilizador"
|
"message": "Definir nome de usuário"
|
||||||
},
|
},
|
||||||
"discordAdvert": {
|
"discordAdvert": {
|
||||||
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
|
"message": "Junte-se ao servidor do discord oficial para dar dicas e sugestões!"
|
||||||
},
|
},
|
||||||
"hideThis": {
|
"hideThis": {
|
||||||
"message": "Esconder isto"
|
"message": "Esconder isto"
|
||||||
@@ -480,9 +477,6 @@
|
|||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "Lembrete de interação (inscrever-se)"
|
"message": "Lembrete de interação (inscrever-se)"
|
||||||
},
|
},
|
||||||
"category_selfpromo": {
|
|
||||||
"message": "Auto-Promoção e Mercadorias"
|
|
||||||
},
|
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Música: Seção sem música"
|
"message": "Música: Seção sem música"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -91,9 +91,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Votado!"
|
"message": "Votado!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Já votou antes."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Deu-se um erro de conecção: Código: "
|
"message": "Deu-se um erro de conecção: Código: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1 +1,633 @@
|
|||||||
{}
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"fullName": {
|
||||||
|
"message": "SponsorBlock pentru YouTube - Sari peste sponsorizări",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"Description": {
|
||||||
|
"message": "Sari peste sponsorizările din videoclipurile de pe YouTube. Adaugă sponsorizări din videoclipurile pe care le urmăriți pentru a salva timpul altora.",
|
||||||
|
"description": "Description of the extension."
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"message": "Serverul a spus că această cerere este invalidă"
|
||||||
|
},
|
||||||
|
"429": {
|
||||||
|
"message": "Ai trimis prea multe timpuri ale sponsorizărilor pentru acest videoclip, sunteți sigur că sunt atât de multe?"
|
||||||
|
},
|
||||||
|
"409": {
|
||||||
|
"message": "Acest lucru a fost deja trimis înainte"
|
||||||
|
},
|
||||||
|
"channelWhitelisted": {
|
||||||
|
"message": "Canalul a fost adăugat la excepții!"
|
||||||
|
},
|
||||||
|
"Sponsor": {
|
||||||
|
"message": "sponsor"
|
||||||
|
},
|
||||||
|
"Sponsors": {
|
||||||
|
"message": "sponsori"
|
||||||
|
},
|
||||||
|
"Segment": {
|
||||||
|
"message": "segment sponsorizat"
|
||||||
|
},
|
||||||
|
"Segments": {
|
||||||
|
"message": "segmente sponsorizate"
|
||||||
|
},
|
||||||
|
"upvoteButtonInfo": {
|
||||||
|
"message": "Votează această înregistrare"
|
||||||
|
},
|
||||||
|
"reportButtonTitle": {
|
||||||
|
"message": "Raportează"
|
||||||
|
},
|
||||||
|
"reportButtonInfo": {
|
||||||
|
"message": "Raportează această înregistrare ca fiind incorectă."
|
||||||
|
},
|
||||||
|
"Dismiss": {
|
||||||
|
"message": "Renunță"
|
||||||
|
},
|
||||||
|
"Loading": {
|
||||||
|
"message": "Se încarcă..."
|
||||||
|
},
|
||||||
|
"Mins": {
|
||||||
|
"message": "Minute"
|
||||||
|
},
|
||||||
|
"Secs": {
|
||||||
|
"message": "Secunde"
|
||||||
|
},
|
||||||
|
"Hide": {
|
||||||
|
"message": "Nu mai afișa niciodată"
|
||||||
|
},
|
||||||
|
"hitGoBack": {
|
||||||
|
"message": "Apasă unskip pentru a reveni."
|
||||||
|
},
|
||||||
|
"unskip": {
|
||||||
|
"message": "Unskip"
|
||||||
|
},
|
||||||
|
"reskip": {
|
||||||
|
"message": "Sari peste"
|
||||||
|
},
|
||||||
|
"paused": {
|
||||||
|
"message": "Pauză"
|
||||||
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Cronometru oprit"
|
||||||
|
},
|
||||||
|
"confirmMSG": {
|
||||||
|
"message": "Pentru a edita sau a șterge valori individuale, apasă butonul de informații sau deschide popup-ul extensiei apăsând iconița extensiei din colțul dreapta sus."
|
||||||
|
},
|
||||||
|
"clearThis": {
|
||||||
|
"message": "Ești sigur că vrei să ștergi asta?\n\n"
|
||||||
|
},
|
||||||
|
"Unknown": {
|
||||||
|
"message": "A apărut o eroare în trimiterea timpilor sponsorizărilor, încearcă din nou mai târziu."
|
||||||
|
},
|
||||||
|
"sponsorFound": {
|
||||||
|
"message": "Sponsorii acestui videoclip se află în baza de date!"
|
||||||
|
},
|
||||||
|
"sponsor404": {
|
||||||
|
"message": "Nu s-a gasit niciun sponsor"
|
||||||
|
},
|
||||||
|
"sponsorStart": {
|
||||||
|
"message": "Sponsorizarea Începe Acum"
|
||||||
|
},
|
||||||
|
"sponsorEnd": {
|
||||||
|
"message": "Sponsorizarea Se Termină Acum"
|
||||||
|
},
|
||||||
|
"noVideoID": {
|
||||||
|
"message": "Nu există niciun videoclip YouTube în aceast tab. Dacă știți că acesta este un tab YouTube, închideți acest popup și deschideți-l din nou. Daca nici asta nu merge, încercați să reîncărcați pagina."
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"message": "Succes!"
|
||||||
|
},
|
||||||
|
"voted": {
|
||||||
|
"message": "Votat!"
|
||||||
|
},
|
||||||
|
"serverDown": {
|
||||||
|
"message": "Se pare că serverul este oprit. Contactează imediat dezvoltatorul."
|
||||||
|
},
|
||||||
|
"connectionError": {
|
||||||
|
"message": "A apărut o eroare de conexiune. Cod de eroare: "
|
||||||
|
},
|
||||||
|
"wantToSubmit": {
|
||||||
|
"message": "Doriți să trimiteți timpii sponsorizărilor pentru acest video id"
|
||||||
|
},
|
||||||
|
"leftTimes": {
|
||||||
|
"message": "Se pare că ați lăsat unii timpi ai sponsorilor netrimiși. Mergeți înapoi la pagina respectivă pentru a îi trimite (timpii nu au fost șterși)."
|
||||||
|
},
|
||||||
|
"clearTimes": {
|
||||||
|
"message": "Șterge Timpii Sponsorizărilor"
|
||||||
|
},
|
||||||
|
"openPopup": {
|
||||||
|
"message": "Deschide Popup-ul SponsorBlock"
|
||||||
|
},
|
||||||
|
"SubmitTimes": {
|
||||||
|
"message": "Trimte Timpii Sponsorizărilor"
|
||||||
|
},
|
||||||
|
"submitCheck": {
|
||||||
|
"message": "Sunteți sigur că doriți să trimiteți asta?"
|
||||||
|
},
|
||||||
|
"whitelistChannel": {
|
||||||
|
"message": "Adaugă Canalul La Excepții"
|
||||||
|
},
|
||||||
|
"removeFromWhitelist": {
|
||||||
|
"message": "Șterge Canalul De La Excepții"
|
||||||
|
},
|
||||||
|
"voteOnTime": {
|
||||||
|
"message": "Votează Timpii Sponsorizărilor"
|
||||||
|
},
|
||||||
|
"recordTimes": {
|
||||||
|
"message": "Înregistrează timpul unei sponsorizări"
|
||||||
|
},
|
||||||
|
"soFarUHSubmited": {
|
||||||
|
"message": "Până acum, ai trimis"
|
||||||
|
},
|
||||||
|
"savedPeopleFrom": {
|
||||||
|
"message": "Ai salvat alte persoane de la "
|
||||||
|
},
|
||||||
|
"viewLeaderboard": {
|
||||||
|
"message": "Vezi clasamentul"
|
||||||
|
},
|
||||||
|
"here": {
|
||||||
|
"message": "aici"
|
||||||
|
},
|
||||||
|
"recordTimesDescription": {
|
||||||
|
"message": "Apasă pe butonul de mai jos când începe o sponsorizare și când se termină pentru a înregistra-o și pentru a o trimite la baza de date."
|
||||||
|
},
|
||||||
|
"popupHint": {
|
||||||
|
"message": "Indiciu: Apasă pe tasta punct și virgulă în timp ce ești centrat pe videoclip pentru a raporta începutul/finalul unei sponsorizări și apasă pe ghilimele pentru a o trimite. (Acest lucru poate fi schimbat din opțiuni)"
|
||||||
|
},
|
||||||
|
"lastTimes": {
|
||||||
|
"message": "Ultimii Timpi Ai Mesajului Sponsorizat Aleși"
|
||||||
|
},
|
||||||
|
"clearTimesButton": {
|
||||||
|
"message": "Șterge Timpii"
|
||||||
|
},
|
||||||
|
"submitTimesButton": {
|
||||||
|
"message": "Trimite Timpii"
|
||||||
|
},
|
||||||
|
"publicStats": {
|
||||||
|
"message": "Acest lucru este folosit pe pagina publică de statistici pentru a arăta cât de mult ai contribuit. Vezi pagina"
|
||||||
|
},
|
||||||
|
"setUsername": {
|
||||||
|
"message": "Setează Numele De Utilizator"
|
||||||
|
},
|
||||||
|
"discordAdvert": {
|
||||||
|
"message": "Vino și alătură-te serverului oficial de discord pentru a oferi sugestii și feedback!"
|
||||||
|
},
|
||||||
|
"hideThis": {
|
||||||
|
"message": "Ascunde asta"
|
||||||
|
},
|
||||||
|
"Options": {
|
||||||
|
"message": "Opţiuni"
|
||||||
|
},
|
||||||
|
"showButtons": {
|
||||||
|
"message": "Arată Butoanele Pe Playerul De YouTube"
|
||||||
|
},
|
||||||
|
"hideButtons": {
|
||||||
|
"message": "Ascunde Butoanele Pe Playerul De YouTube"
|
||||||
|
},
|
||||||
|
"hideButtonsDescription": {
|
||||||
|
"message": "Asta ascunde butoanele ce apar pe playerul de YouTube pentru a trimite segmente."
|
||||||
|
},
|
||||||
|
"showInfoButton": {
|
||||||
|
"message": "Arată Butoanele De Informații Pe Playerul De YouTube"
|
||||||
|
},
|
||||||
|
"hideInfoButton": {
|
||||||
|
"message": "Ascunde Butoanele De Informații Pe Playerul De YouTube"
|
||||||
|
},
|
||||||
|
"whatInfoButton": {
|
||||||
|
"message": "Acesta este butonul care deschide popup-ul pe pagina de YouTube."
|
||||||
|
},
|
||||||
|
"hideDeleteButton": {
|
||||||
|
"message": "Ascunde Butonul De Ștergere Pe Playerul De YouTube"
|
||||||
|
},
|
||||||
|
"showDeleteButton": {
|
||||||
|
"message": "Arată Butonul De Ștergere Pe Playerul De YouTube"
|
||||||
|
},
|
||||||
|
"whatDeleteButton": {
|
||||||
|
"message": "Acest buton de pe playerul de YouTube va șterge toate segmentele netrimise pentru videoclipul curent."
|
||||||
|
},
|
||||||
|
"disableViewTracking": {
|
||||||
|
"message": "Dezactivează Urmărirea Săriturilor"
|
||||||
|
},
|
||||||
|
"enableViewTracking": {
|
||||||
|
"message": "Activează Urmărirea Săriturilor"
|
||||||
|
},
|
||||||
|
"whatViewTracking": {
|
||||||
|
"message": "Acest lucru urmărește peste ce sponsori ai sărit pentru a informa utilizatorii cât de mult înregistrările lor i-au ajutat pe alții și\neste folosit ca un contor împreună cu upvoturile pentru a ne asigura că spamul nu pătrunde în baza de date. Extensia trimite un mesaj\nserverului de fiecare dată când sari peste un sponsor. Sperăm că majoritatea oamenilor nu vor schimba această setare astfel că numerele să fie exacte. :)"
|
||||||
|
},
|
||||||
|
"showNotice": {
|
||||||
|
"message": "Arată Notificarea Din Nou"
|
||||||
|
},
|
||||||
|
"longDescription": {
|
||||||
|
"message": "SponsorBlock este o extensie care va sări peste segmentele sponsorizate din videoclipurile de pe YouTube. SponsorBlock este o extensie crowdsourced care lasă pe oricine să trimită începutul și finalul segmentelor sponsorizate din videoclipurile de pe YouTube. Odată ce o persoană trimite aceste informații, toată lumea cu această extensie va sări peste acel segment sponsorizat.",
|
||||||
|
"description": "Full description of the extension on the store pages."
|
||||||
|
},
|
||||||
|
"website": {
|
||||||
|
"message": "Website",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"sourceCode": {
|
||||||
|
"message": "Cod Sursă",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"noticeUpdate": {
|
||||||
|
"message": "Notificarea a fost actualizată!",
|
||||||
|
"description": "The first line of the message displayed after the notice was upgraded."
|
||||||
|
},
|
||||||
|
"noticeUpdate2": {
|
||||||
|
"message": "Dacă nu îți place, apasă butonul nu mai arăta niciodată.",
|
||||||
|
"description": "The second line of the message displayed after the notice was upgraded."
|
||||||
|
},
|
||||||
|
"setStartSponsorShortcut": {
|
||||||
|
"message": "Setează tasta pentru pornirea sponsorizării"
|
||||||
|
},
|
||||||
|
"setSubmitKeybind": {
|
||||||
|
"message": "Setează tasta pentru trimiterea sponsorizării"
|
||||||
|
},
|
||||||
|
"keybindDescription": {
|
||||||
|
"message": "Selectează o tastă apasând-o"
|
||||||
|
},
|
||||||
|
"keybindDescriptionComplete": {
|
||||||
|
"message": "Tasta a fost setată la: "
|
||||||
|
},
|
||||||
|
"0": {
|
||||||
|
"message": "Eroare de Conexiune. Verifică-ți conexiunea la internet. Daca internetul functionează, serverul este probabil supraîncărcat sau a căzut."
|
||||||
|
},
|
||||||
|
"disableSkipping": {
|
||||||
|
"message": "Dezactivează SponsorBlock"
|
||||||
|
},
|
||||||
|
"enableSkipping": {
|
||||||
|
"message": "Activează SponsorBlock"
|
||||||
|
},
|
||||||
|
"yourWork": {
|
||||||
|
"message": "Munca Ta",
|
||||||
|
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||||
|
},
|
||||||
|
"502": {
|
||||||
|
"message": "Serverul pare să fie supraîncărcat. Încercați din nou în câteva secunde."
|
||||||
|
},
|
||||||
|
"errorCode": {
|
||||||
|
"message": "Codul Erorii: "
|
||||||
|
},
|
||||||
|
"skip": {
|
||||||
|
"message": "Sari"
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Sărit"
|
||||||
|
},
|
||||||
|
"disableAutoSkip": {
|
||||||
|
"message": "Dezactivează Autoskip"
|
||||||
|
},
|
||||||
|
"enableAutoSkip": {
|
||||||
|
"message": "Activează Autoskip"
|
||||||
|
},
|
||||||
|
"autoSkipDescription": {
|
||||||
|
"message": "Autoskip va sări automat peste segmentele sponsorizate pentru tine. Dacă este dezactivată, o notificare va apărea care vă va întreba dacă doriți să săriți peste."
|
||||||
|
},
|
||||||
|
"audioNotification": {
|
||||||
|
"message": "Notificare Audio Când Sari"
|
||||||
|
},
|
||||||
|
"audioNotificationDescription": {
|
||||||
|
"message": "Notificarea audio va reda un sunet atunci când sari peste un segement sponsorizat. Daca este dezactivat (sau autoskip este dezactivat), niciun sunet nu va fi redat."
|
||||||
|
},
|
||||||
|
"youHaveSkipped": {
|
||||||
|
"message": "Ai sărit peste "
|
||||||
|
},
|
||||||
|
"youHaveSaved": {
|
||||||
|
"message": "V-ați salvat "
|
||||||
|
},
|
||||||
|
"minLower": {
|
||||||
|
"message": "minut"
|
||||||
|
},
|
||||||
|
"minsLower": {
|
||||||
|
"message": "minute"
|
||||||
|
},
|
||||||
|
"hourLower": {
|
||||||
|
"message": "oră"
|
||||||
|
},
|
||||||
|
"hoursLower": {
|
||||||
|
"message": "ore"
|
||||||
|
},
|
||||||
|
"youHaveSavedTime": {
|
||||||
|
"message": "Ai salvat alte persoane"
|
||||||
|
},
|
||||||
|
"youHaveSavedTimeEnd": {
|
||||||
|
"message": " din viața lor."
|
||||||
|
},
|
||||||
|
"guildlinesSummary": {
|
||||||
|
"message": "- Asigurați-vă că segmentul conține doar promoții plătite, nimic altceva.\n- Asigurați-vă că dacă săriți peste acest segment nu săriți și peste conținut valoros\n- Dacă tot videoclipul este o sponsorizare, vă rugăm să nu îl trimiteți. Un sistem de trimitere a întregului videoclip este în lucru.\n- Vă rugăm să nu trimiteți mențiunile că videoclipul este sponsorizat care ar putea arăta favoritismul (spre exemplu dacă un videoclip de tip review este sponsorizat, nu trimiteți mențiunea că acel videoclip este sponsorizat)."
|
||||||
|
},
|
||||||
|
"statusReminder": {
|
||||||
|
"message": "Verificați status.sponsor.ajay.app pentru starea serverului."
|
||||||
|
},
|
||||||
|
"changeUserID": {
|
||||||
|
"message": "Importă/Exportă Id-ul Tău De Utilizator"
|
||||||
|
},
|
||||||
|
"whatChangeUserID": {
|
||||||
|
"message": "Acest lucru trebuie să fie păstrat. Este ca și o parolă și nu ar trebui împartășită cu nimeni. Daca cineva are acest lucru, se poate da drept tu."
|
||||||
|
},
|
||||||
|
"setUserID": {
|
||||||
|
"message": "Setează Id-ul Utilizatorului"
|
||||||
|
},
|
||||||
|
"userIDChangeWarning": {
|
||||||
|
"message": "Atenție: Schimbarea Id-ului Utilizatorului este permanentă. Sunteți sigur că doriți să faceți asta? Asigurați-vă că ați făcut o copie de rezervă."
|
||||||
|
},
|
||||||
|
"createdBy": {
|
||||||
|
"message": "Creat De"
|
||||||
|
},
|
||||||
|
"autoSkip": {
|
||||||
|
"message": "Sari Peste Automat"
|
||||||
|
},
|
||||||
|
"showSkipNotice": {
|
||||||
|
"message": "Arată O Notificare După Ce Am Sărit Peste O Sponsorizare"
|
||||||
|
},
|
||||||
|
"keybindCurrentlySet": {
|
||||||
|
"message": ". În prezent este setat:"
|
||||||
|
},
|
||||||
|
"supportInvidious": {
|
||||||
|
"message": "Sprijină Invidious"
|
||||||
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) este un client YouTube terț. Pentru a susține, trebuie să acceptați permisiunile suprimentare. Această funcție NU funcționează în incognito pe Chrome sau în alte variante Chromium."
|
||||||
|
},
|
||||||
|
"optionsInfo": {
|
||||||
|
"message": "Activează suportul Invidious, dezactivează autoskip-ul, ascunde butoanele și altele."
|
||||||
|
},
|
||||||
|
"addInvidiousInstance": {
|
||||||
|
"message": "Adaugă O Instanță Invidious"
|
||||||
|
},
|
||||||
|
"addInvidiousInstanceDescription": {
|
||||||
|
"message": "Adaugă o instanță personalizată Invidious. Aceasta trebuie să fie formatată DOAR cu domeniul. Exemplu: invidious.ajay.app"
|
||||||
|
},
|
||||||
|
"add": {
|
||||||
|
"message": "Adaugă"
|
||||||
|
},
|
||||||
|
"addInvidiousInstanceError": {
|
||||||
|
"message": "Acesta este un domeniu invalid. Acesta trebuie să includă DOAR partea de domeniu. Exemplu: invidious.ajay.app"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstance": {
|
||||||
|
"message": "Resetează Lista De Instanțe Invidious"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstanceAlert": {
|
||||||
|
"message": "Sunteți pe cale să resetați lista de instanțe Invidious"
|
||||||
|
},
|
||||||
|
"currentInstances": {
|
||||||
|
"message": "Instanțele curente:"
|
||||||
|
},
|
||||||
|
"minDuration": {
|
||||||
|
"message": "Durată minimă (secunde):"
|
||||||
|
},
|
||||||
|
"minDurationDescription": {
|
||||||
|
"message": "Segmentele de sponsor mai scurte decât valoarea setată nu vor fi omise sau afișate în player."
|
||||||
|
},
|
||||||
|
"shortCheck": {
|
||||||
|
"message": "Următoarea înregistrare este mai mică decât opțiunea voastră de durată minimă. Acest lucru ar putea însemna că a fost deja trimisă și a fost ignorat datorită acestei opțiuni. Sunteți sigur că doriți să trimiteți?"
|
||||||
|
},
|
||||||
|
"showUploadButton": {
|
||||||
|
"message": "Arată Butonul De Încărcare"
|
||||||
|
},
|
||||||
|
"whatUploadButton": {
|
||||||
|
"message": "Acest buton apare pe playerul YouTube după ce ați selectat un marcaj de timp și sunteți gata să îl trimiteți."
|
||||||
|
},
|
||||||
|
"customServerAddress": {
|
||||||
|
"message": "Adresa Serverului SponsorBlock"
|
||||||
|
},
|
||||||
|
"customServerAddressDescription": {
|
||||||
|
"message": "Adresa SponsorBlock este folosită pentru a se efectua apeluri către server.\nDacă nu ai propriul tău server, acesta nu ar trebui modificat."
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"message": "Salvează"
|
||||||
|
},
|
||||||
|
"reset": {
|
||||||
|
"message": "Resetează"
|
||||||
|
},
|
||||||
|
"customAddressError": {
|
||||||
|
"message": "Adresa nu este în forma corectă. Asigurați-vă că http:// sau https:// se află la început."
|
||||||
|
},
|
||||||
|
"areYouSureReset": {
|
||||||
|
"message": "Sunteți sigur că doriți să resetați asta?"
|
||||||
|
},
|
||||||
|
"confirmPrivacy": {
|
||||||
|
"message": "Acest videoclip a fost detectat ca nelistat. Apasă anulați dacă nu doriți să verificați sponsorii."
|
||||||
|
},
|
||||||
|
"unlistedCheck": {
|
||||||
|
"message": "Ignoră Videoclipurile Nelistate/Private"
|
||||||
|
},
|
||||||
|
"whatUnlistedCheck": {
|
||||||
|
"message": "Această setare va încetini puțin SponsorBlock. Căutările segmentelor sponsorizate necesită trimiterea ID-ului videoclipului către server. Dacă sunteți îngrijorat de trimiterea ID-ul videoclipurilor nelistate, activați această opțiune."
|
||||||
|
},
|
||||||
|
"mobileUpdateInfo": {
|
||||||
|
"message": "m.youtube.com este acum suportat"
|
||||||
|
},
|
||||||
|
"exportOptions": {
|
||||||
|
"message": "Importă/Exportă Toate Opțiunile"
|
||||||
|
},
|
||||||
|
"whatExportOptions": {
|
||||||
|
"message": "Aceasta este întreaga configurație în format JSON. Asta include si ID-ul tău de utilizator, așa că fi sigur să împărtășești asta cu înțelepciune."
|
||||||
|
},
|
||||||
|
"setOptions": {
|
||||||
|
"message": "Setează Opțiuni"
|
||||||
|
},
|
||||||
|
"exportOptionsWarning": {
|
||||||
|
"message": "Atenție: Schimbarea acestei opțiuni este permanentă și poate strica instalarea. Sunteți sigur că doriți să faceți asta? Asigurati-vă că ați făcut o copie de rezervă."
|
||||||
|
},
|
||||||
|
"incorrectlyFormattedOptions": {
|
||||||
|
"message": "Acest JSON nu este formatat corect. Opțiunile dumneavoastră nu au fost modificate."
|
||||||
|
},
|
||||||
|
"confirmNoticeTitle": {
|
||||||
|
"message": "Trimite Segment"
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"message": "Trimite"
|
||||||
|
},
|
||||||
|
"cancel": {
|
||||||
|
"message": "Anulează"
|
||||||
|
},
|
||||||
|
"delete": {
|
||||||
|
"message": "Șterge"
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"message": "Previzualizare"
|
||||||
|
},
|
||||||
|
"edit": {
|
||||||
|
"message": "Editare"
|
||||||
|
},
|
||||||
|
"copyDebugInformation": {
|
||||||
|
"message": "Copiază Informațiile de Depanare În Clipboard"
|
||||||
|
},
|
||||||
|
"copyDebugInformationFailed": {
|
||||||
|
"message": "Eroare la scrierea în clipboard"
|
||||||
|
},
|
||||||
|
"copyDebugInformationOptions": {
|
||||||
|
"message": "Copiază informația în clipboard pentru a fi furnizată dezvoltatorului când se găsește o eroare / când un dezvoltator o cere. Informațiile sensibile precum ID-ul de utilizator, canale exceptate, și adresa serverului personalizat au fost șterse. Însă conține informații precum useragent-ul, browser-ul, sistemul de operare, și numărul versiunii extensiei. "
|
||||||
|
},
|
||||||
|
"copyDebugInformationComplete": {
|
||||||
|
"message": "Informația de depanare a fost copiată în clipboard. Puteți elimina orice informație pe care nu doriți să o partajați. Salvați într-un fișier sau lipiți-o în raportul de erori."
|
||||||
|
},
|
||||||
|
"theKey": {
|
||||||
|
"message": "Tasta"
|
||||||
|
},
|
||||||
|
"keyAlreadyUsedByYouTube": {
|
||||||
|
"message": "este deja utilizat de YouTube. Vă rugăm selectați o altă tastă."
|
||||||
|
},
|
||||||
|
"keyAlreadyUsed": {
|
||||||
|
"message": "este deja setată la o altă acțiune. Vă rugăm să selectați o altă tastă."
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"message": "până la",
|
||||||
|
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||||
|
},
|
||||||
|
"category_sponsor": {
|
||||||
|
"message": "Sponsor"
|
||||||
|
},
|
||||||
|
"category_sponsor_description": {
|
||||||
|
"message": "Promovare plătită, refferali plătiți și reclame directe. Nu pentru autopromovări sau promovări gratis ale cauzelor/creatorilor/website-urilor/produselor."
|
||||||
|
},
|
||||||
|
"category_intro": {
|
||||||
|
"message": "Animație de Început"
|
||||||
|
},
|
||||||
|
"category_intro_description": {
|
||||||
|
"message": "Animațiile de introducere care se repetă în serie sau care nu oferă nici o valoare directă. Această opțiune nu ar trebui folosită în videoclipurile muzicale."
|
||||||
|
},
|
||||||
|
"category_intro_short": {
|
||||||
|
"message": "Intro"
|
||||||
|
},
|
||||||
|
"category_outro": {
|
||||||
|
"message": "Ecran De Final/Credite"
|
||||||
|
},
|
||||||
|
"category_outro_description": {
|
||||||
|
"message": "Credite sau când ecranul de final YouTube apare. Nu pentru concluzii vorbite. Nu ar trebui să includă conținut util. Nu ar trebui folosit în videoclipuri muzicale."
|
||||||
|
},
|
||||||
|
"category_interaction": {
|
||||||
|
"message": "Reamintire de Interactiune (Abonare)"
|
||||||
|
},
|
||||||
|
"category_interaction_description": {
|
||||||
|
"message": "Când există o scurtă remintire pentru like, abonare sau urmărire în mijlocul conținutului. Daca este mai lung sau despre ceva specific, folosiți autopromovarea."
|
||||||
|
},
|
||||||
|
"category_interaction_short": {
|
||||||
|
"message": "Reamintire de Interacțiune"
|
||||||
|
},
|
||||||
|
"category_selfpromo": {
|
||||||
|
"message": "Promovare neplătită/autopromovare"
|
||||||
|
},
|
||||||
|
"category_selfpromo_description": {
|
||||||
|
"message": "Similar cu \"sponsorizare\" doar că este neplătit sau autopromovare. Aceasta include secțiuni despre merchandise, donații, sau informații despre cei cu care au colaborat."
|
||||||
|
},
|
||||||
|
"category_music_offtopic": {
|
||||||
|
"message": "Muzică: Secţiune Non-Muzicală"
|
||||||
|
},
|
||||||
|
"category_music_offtopic_description": {
|
||||||
|
"message": "Doar pentru videoclipuri muzicale. Include introducțiile sau outro-urile în videoclipurile muzicale."
|
||||||
|
},
|
||||||
|
"category_music_offtopic_short": {
|
||||||
|
"message": "Non-Muzical"
|
||||||
|
},
|
||||||
|
"category_livestream_messages": {
|
||||||
|
"message": "Transmisiune În Direct: Donație/Citirea Mesajelor"
|
||||||
|
},
|
||||||
|
"category_livestream_messages_short": {
|
||||||
|
"message": "Citire Mesaj"
|
||||||
|
},
|
||||||
|
"disable": {
|
||||||
|
"message": "Dezactivare"
|
||||||
|
},
|
||||||
|
"manualSkip": {
|
||||||
|
"message": "Sari Peste Manual"
|
||||||
|
},
|
||||||
|
"showOverlay": {
|
||||||
|
"message": "Arată În Bara de Derulare"
|
||||||
|
},
|
||||||
|
"colorFormatIncorrect": {
|
||||||
|
"message": "Culoarea ta este formatată incorect. Ar trebui să fie un cod hexadecimal de 3 sau 6 cifre cu un hash la început."
|
||||||
|
},
|
||||||
|
"previewColor": {
|
||||||
|
"message": "Previzualizare Culoare",
|
||||||
|
"description": "Referring to submissions that have not been sent to the server yet."
|
||||||
|
},
|
||||||
|
"seekBarColor": {
|
||||||
|
"message": "Culoarea Barei de Derulare"
|
||||||
|
},
|
||||||
|
"category": {
|
||||||
|
"message": "Categorie"
|
||||||
|
},
|
||||||
|
"skipOption": {
|
||||||
|
"message": "Opțiunea Săriturii",
|
||||||
|
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||||
|
},
|
||||||
|
"enableTestingServer": {
|
||||||
|
"message": "Activează Serverul de Teste"
|
||||||
|
},
|
||||||
|
"whatEnableTestingServer": {
|
||||||
|
"message": "Înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal. Utilizați asta doar pentru teste."
|
||||||
|
},
|
||||||
|
"testingServerWarning": {
|
||||||
|
"message": "Toate înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal în timp ce vă conectați la serverul de teste. Asigurați-vă că dezactivați asta când vreți să trimiteți înregistrări reale."
|
||||||
|
},
|
||||||
|
"bracketNow": {
|
||||||
|
"message": "(Acum)"
|
||||||
|
},
|
||||||
|
"moreCategories": {
|
||||||
|
"message": "Mai multe categorii"
|
||||||
|
},
|
||||||
|
"bracketEnd": {
|
||||||
|
"message": "(Sfârșit)"
|
||||||
|
},
|
||||||
|
"hiddenDueToDownvote": {
|
||||||
|
"message": "ascuns: downvote"
|
||||||
|
},
|
||||||
|
"hiddenDueToDuration": {
|
||||||
|
"message": "ascuns: prea scurt"
|
||||||
|
},
|
||||||
|
"channelDataNotFound": {
|
||||||
|
"message": "ID-ul Canalului nu a fost încărcat încă."
|
||||||
|
},
|
||||||
|
"adblockerIssue": {
|
||||||
|
"message": "Se pare că ceva blocheaza abilitatea extensiei SponsorBlock pentru a obține datele videoclipului. Cel mai probabil este adblocker-ul dumneavoastră. Vă rugăm să verificați https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
|
},
|
||||||
|
"itCouldBeAdblockerIssue": {
|
||||||
|
"message": "Dacă acest lucru continuă să se întample, ar putea fi cauzat de adblocker-ul dumneavoastră. Vă rugăm să verificați \nhttps://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
|
},
|
||||||
|
"forceChannelCheck": {
|
||||||
|
"message": "Forțează Verificarea Canalului Înainte De A Sări Peste Sponsorizări"
|
||||||
|
},
|
||||||
|
"whatForceChannelCheck": {
|
||||||
|
"message": "În mod implicit, va sări peste sponsorizări chiar și înainte de a ști ce canal este. În mod implicit, s-ar putea să se sară și peste unele sponsorizări ce încep la secunda zero din canalele excluse. Activând această opțiune va preveni asta, dar va face ca toate săriturile să aibă o ușoară întârziere, deoarece obținerea Id-ului canalului poate dura ceva timp. Această întărziere poate fi neobservată daca aveți internet rapid."
|
||||||
|
},
|
||||||
|
"forceChannelCheckPopup": {
|
||||||
|
"message": "Consideră Activarea Forțării Verificarii Canalului Înainte De A Sări Peste Sponsorizări"
|
||||||
|
},
|
||||||
|
"downvoteDescription": {
|
||||||
|
"message": "Timpi Incorecți/Greșiți"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Categorie Greșită"
|
||||||
|
},
|
||||||
|
"nonMusicCategoryOnMusic": {
|
||||||
|
"message": "Categoria acestui videoclip este muzică. Sunteți sigur că doriți să trimiteți segmente non-muzicale? Dacă acest videoclip nu este de fapt muzică, nu ar trebui să trimiteți acest segment. Vă rugăm să citiți recomandările dacă sunteți confuz."
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Segmente Multiple"
|
||||||
|
},
|
||||||
|
"guidelines": {
|
||||||
|
"message": "Instrucțiuni"
|
||||||
|
},
|
||||||
|
"readTheGuidelines": {
|
||||||
|
"message": "Citește Instrucțiunile!!",
|
||||||
|
"description": "Show the first time they submit or if they are \"high risk\""
|
||||||
|
},
|
||||||
|
"categoryUpdate1": {
|
||||||
|
"message": "Categoriile sunt aici!"
|
||||||
|
},
|
||||||
|
"categoryUpdate2": {
|
||||||
|
"message": "Deschide opțiunile pentru a sări peste intro-uri, outro-uri, merch, etc."
|
||||||
|
},
|
||||||
|
"unsubmittedWarning": {
|
||||||
|
"message": "Notificare Segmente Netrimise"
|
||||||
|
},
|
||||||
|
"unsubmittedWarningDescription": {
|
||||||
|
"message": "Trimite o notificare atunci când părăsești un video cu segmente care nu au fost încărcate"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -95,9 +95,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Голос засчитан!"
|
"message": "Голос засчитан!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Вы уже проголосовали таким образом раньше."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Ошибка соединения. Код ошибки: "
|
"message": "Ошибка соединения. Код ошибки: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
{
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
"fullName": {
|
"fullName": {
|
||||||
"message": "SponsorBlock för YouTube - Hoppa över sponsring",
|
"message": "SponsorBlock för YouTube - Hoppa över sponsring",
|
||||||
"description": "Name of the extension."
|
"description": "Name of the extension."
|
||||||
@@ -19,6 +23,9 @@
|
|||||||
"channelWhitelisted": {
|
"channelWhitelisted": {
|
||||||
"message": "Kanal vitlistad!"
|
"message": "Kanal vitlistad!"
|
||||||
},
|
},
|
||||||
|
"Sponsor": {
|
||||||
|
"message": "sponsor"
|
||||||
|
},
|
||||||
"Sponsors": {
|
"Sponsors": {
|
||||||
"message": "sponsorer"
|
"message": "sponsorer"
|
||||||
},
|
},
|
||||||
@@ -31,6 +38,9 @@
|
|||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Rapportera"
|
"message": "Rapportera"
|
||||||
},
|
},
|
||||||
|
"reportButtonInfo": {
|
||||||
|
"message": "Rapportera det här segmentet som inkorrekt."
|
||||||
|
},
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Avfärda"
|
"message": "Avfärda"
|
||||||
},
|
},
|
||||||
@@ -58,6 +68,9 @@
|
|||||||
"paused": {
|
"paused": {
|
||||||
"message": "Pausad"
|
"message": "Pausad"
|
||||||
},
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Timern stoppad"
|
||||||
|
},
|
||||||
"confirmMSG": {
|
"confirmMSG": {
|
||||||
"message": "Klicka på infoknappen eller öppna popup-rutan genom att klicka på tilläggets ikon i hörnet uppe till höger för att redigera eller ta bort inviduella värden."
|
"message": "Klicka på infoknappen eller öppna popup-rutan genom att klicka på tilläggets ikon i hörnet uppe till höger för att redigera eller ta bort inviduella värden."
|
||||||
},
|
},
|
||||||
@@ -88,8 +101,8 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Röstat!"
|
"message": "Röstat!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
"serverDown": {
|
||||||
"message": "Du har redan röstat."
|
"message": "Det verkar som att servern är nere. Kontakta utvecklaren omedelbart."
|
||||||
},
|
},
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Anslutningsfel. Felkod: "
|
"message": "Anslutningsfel. Felkod: "
|
||||||
@@ -133,6 +146,9 @@
|
|||||||
"viewLeaderboard": {
|
"viewLeaderboard": {
|
||||||
"message": "Se leaderboarden"
|
"message": "Se leaderboarden"
|
||||||
},
|
},
|
||||||
|
"here": {
|
||||||
|
"message": "här"
|
||||||
|
},
|
||||||
"recordTimesDescription": {
|
"recordTimesDescription": {
|
||||||
"message": "Klicka på knappen nedan när sponsormeddelandet börjar och slutar för att spela in och rapportera till databasen."
|
"message": "Klicka på knappen nedan när sponsormeddelandet börjar och slutar för att spela in och rapportera till databasen."
|
||||||
},
|
},
|
||||||
@@ -256,6 +272,9 @@
|
|||||||
"skip": {
|
"skip": {
|
||||||
"message": "Hoppa över"
|
"message": "Hoppa över"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Skippat"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "Avaktivera Hoppa Över Automatiskt"
|
"message": "Avaktivera Hoppa Över Automatiskt"
|
||||||
},
|
},
|
||||||
@@ -328,6 +347,9 @@
|
|||||||
"supportInvidious": {
|
"supportInvidious": {
|
||||||
"message": "Stöd Invidious"
|
"message": "Stöd Invidious"
|
||||||
},
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) är en tredjeparts YouTube-klient. För att aktivera stöd måste du acceptera de extra behörigheterna. Detta kommer INTE att fungera i incognito i Chrome och andra Cromium-varianter."
|
||||||
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "Aktivera Invidious stöd, avaktivera hoppa över automatiskt, dölj knappar och mer."
|
"message": "Aktivera Invidious stöd, avaktivera hoppa över automatiskt, dölj knappar och mer."
|
||||||
},
|
},
|
||||||
@@ -458,8 +480,20 @@
|
|||||||
"category_sponsor": {
|
"category_sponsor": {
|
||||||
"message": "Sponsormeddelande"
|
"message": "Sponsormeddelande"
|
||||||
},
|
},
|
||||||
"category_selfpromo": {
|
"category_intro": {
|
||||||
"message": "Självreklam och egna produkter"
|
"message": "Intro-animation"
|
||||||
|
},
|
||||||
|
"category_intro_description": {
|
||||||
|
"message": "Intro-animationer som är återkommande i serien eller inte ger direkt värde. Detta bör inte användas på musikvideor."
|
||||||
|
},
|
||||||
|
"category_intro_short": {
|
||||||
|
"message": "Intro"
|
||||||
|
},
|
||||||
|
"category_music_offtopic_description": {
|
||||||
|
"message": "Endast för användning i musikvideor. Detta inkluderar intros och outros i musikvideor."
|
||||||
|
},
|
||||||
|
"category_music_offtopic_short": {
|
||||||
|
"message": "Icke-musik"
|
||||||
},
|
},
|
||||||
"disable": {
|
"disable": {
|
||||||
"message": "Avaktivera"
|
"message": "Avaktivera"
|
||||||
@@ -470,6 +504,9 @@
|
|||||||
"showOverlay": {
|
"showOverlay": {
|
||||||
"message": "Visa Lager Ovanpå Spelare"
|
"message": "Visa Lager Ovanpå Spelare"
|
||||||
},
|
},
|
||||||
|
"category": {
|
||||||
|
"message": "Kategori"
|
||||||
|
},
|
||||||
"enableTestingServer": {
|
"enableTestingServer": {
|
||||||
"message": "Aktivera Server För Betatestning"
|
"message": "Aktivera Server För Betatestning"
|
||||||
},
|
},
|
||||||
@@ -488,6 +525,9 @@
|
|||||||
"bracketEnd": {
|
"bracketEnd": {
|
||||||
"message": "(Slut)"
|
"message": "(Slut)"
|
||||||
},
|
},
|
||||||
|
"hiddenDueToDuration": {
|
||||||
|
"message": "dold: för kort"
|
||||||
|
},
|
||||||
"channelDataNotFound": {
|
"channelDataNotFound": {
|
||||||
"message": "Kanal-ID är inte inladdat än."
|
"message": "Kanal-ID är inte inladdat än."
|
||||||
},
|
},
|
||||||
@@ -496,5 +536,24 @@
|
|||||||
},
|
},
|
||||||
"itCouldBeAdblockerIssue": {
|
"itCouldBeAdblockerIssue": {
|
||||||
"message": "Om detta fortsätter att inträffa, kan orsaken vara din annonsblockerare. Vänligen kontrollera https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
"message": "Om detta fortsätter att inträffa, kan orsaken vara din annonsblockerare. Vänligen kontrollera https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
|
},
|
||||||
|
"downvoteDescription": {
|
||||||
|
"message": "Fel timing"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Fel kategori"
|
||||||
|
},
|
||||||
|
"nonMusicCategoryOnMusic": {
|
||||||
|
"message": "Den här videon är kategoriserad som musik. Är du säker på att du vill skicka in segment med icke-musikkategorier? Om denna video faktiskt är musik, bör du inte skicka in detta segment. Vänligen läs riktlinjerna om du är förvirrad."
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Flera segment"
|
||||||
|
},
|
||||||
|
"guidelines": {
|
||||||
|
"message": "Riktlinjer"
|
||||||
|
},
|
||||||
|
"readTheGuidelines": {
|
||||||
|
"message": "Läs riktlinjerna!!",
|
||||||
|
"description": "Show the first time they submit or if they are \"high risk\""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,9 +104,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Oylandı!"
|
"message": "Oylandı!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Bu şekilde zaten oy kullanmıştın."
|
|
||||||
},
|
|
||||||
"serverDown": {
|
"serverDown": {
|
||||||
"message": "Sunucu çökmüş gibi duruyor. Derhal geliştiriciyle iletişime geçin."
|
"message": "Sunucu çökmüş gibi duruyor. Derhal geliştiriciyle iletişime geçin."
|
||||||
},
|
},
|
||||||
@@ -496,7 +493,7 @@
|
|||||||
"message": "Etkileşim Hatırlatıcısı (Abonelik)"
|
"message": "Etkileşim Hatırlatıcısı (Abonelik)"
|
||||||
},
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "Kendi Reklamını Yapma ve Ürün"
|
"message": "Karşılıksız/Kendi Reklamı"
|
||||||
},
|
},
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Müzik: Müzik Olmayan Bölüm"
|
"message": "Müzik: Müzik Olmayan Bölüm"
|
||||||
|
|||||||
@@ -95,9 +95,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Голос зарахований!"
|
"message": "Голос зарахований!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "Ви вже проголосували таким чином раніше."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Помилка з'єднання. Код помилки: "
|
"message": "Помилка з'єднання. Код помилки: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -104,9 +104,6 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "已投票!"
|
"message": "已投票!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "您之前已经这样投过了。"
|
|
||||||
},
|
|
||||||
"serverDown": {
|
"serverDown": {
|
||||||
"message": "服务器似乎已宕机。请立即联系开发者。"
|
"message": "服务器似乎已宕机。请立即联系开发者。"
|
||||||
},
|
},
|
||||||
@@ -496,7 +493,7 @@
|
|||||||
"message": "互动提醒(订阅)"
|
"message": "互动提醒(订阅)"
|
||||||
},
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "自我推销和商品"
|
"message": "未收钱的/自我推销"
|
||||||
},
|
},
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "音乐:非音乐部分"
|
"message": "音乐:非音乐部分"
|
||||||
|
|||||||
@@ -395,3 +395,21 @@ input::-webkit-inner-spin-button {
|
|||||||
border-width: 3px;
|
border-width: 3px;
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.helpButton {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.helpButton {
|
||||||
|
height: 25px;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 5px;
|
||||||
|
|
||||||
|
margin: auto;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.helpButton:hover {
|
||||||
|
filter: brightness(80%);
|
||||||
|
}
|
||||||
@@ -30,15 +30,15 @@
|
|||||||
Come contribute, make some suggestions and help out in the Discord: <a href="https://discord.gg/QnmVMpU">https://discord.gg/QnmVMpU</a>
|
Come contribute, make some suggestions and help out in the Discord: <a href="https://discord.gg/QnmVMpU">https://discord.gg/QnmVMpU</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="center">
|
<p style="margin-bottom: 0" class="bigText center">Please review the options below</p>
|
||||||
<a class="bigText" href="/options/options.html">Enable optional features</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Some features, such as support for non third-party YouTube sites, are disabled by default and can be enabled in the options. These can be enabled or disabled at any time.
|
Many features are disabled by default. If you want to skip Intros, outros, use Invidious, please enable the specific options. These can be enabled or disabled at any time.
|
||||||
You can also hide/show all UI elements added to the YouTube page.
|
You can also hide/show all UI elements added to the YouTube page.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<iframe src="../options/options.html#embed" width="100%" height="500px" style="border: none"></iframe>
|
||||||
|
|
||||||
<h1>How skipping works</h1>
|
<h1>How skipping works</h1>
|
||||||
|
|
||||||
<p class="projectPreview">
|
<p class="projectPreview">
|
||||||
|
|||||||
58
public/icons/help.svg
Normal file
58
public/icons/help.svg
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="help.svg"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||||
|
<metadata
|
||||||
|
id="metadata12">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="730"
|
||||||
|
inkscape:window-height="480"
|
||||||
|
id="namedview8"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="9.8333333"
|
||||||
|
inkscape:cx="12"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<path
|
||||||
|
d="M0 0h24v24H0z"
|
||||||
|
fill="none"
|
||||||
|
id="path2" />
|
||||||
|
<path
|
||||||
|
d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"
|
||||||
|
id="path4"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -347,3 +347,7 @@ svg {
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.categoryColorTextBox {
|
||||||
|
width: 60px;
|
||||||
|
}
|
||||||
@@ -12,13 +12,13 @@
|
|||||||
|
|
||||||
<body class="sponsorBlockPageBody">
|
<body class="sponsorBlockPageBody">
|
||||||
|
|
||||||
<div id="title">
|
<div id="title" class="titleBar">
|
||||||
<img src="../icons/LogoSponsorBlocker256px.png" height="80" class="profilepic"/>
|
<img src="../icons/LogoSponsorBlocker256px.png" height="80" class="profilepic"/>
|
||||||
SponsorBlock
|
SponsorBlock
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="center">
|
<div class="center">
|
||||||
<p class="createdBy">__MSG_createdBy__ <a href="https://ajay.app">Ajay Ramachandran</a> <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
|
<p class="createdBy titleBar">__MSG_createdBy__ <a href="https://ajay.app">Ajay Ramachandran</a> <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
|
||||||
|
|
||||||
<h1>__MSG_Options__</h1>
|
<h1>__MSG_Options__</h1>
|
||||||
|
|
||||||
@@ -152,6 +152,40 @@
|
|||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
|
<div option-type="toggle" sync-option="unsubmittedWarning">
|
||||||
|
<label class="switch-container" label-name="__MSG_unsubmittedWarning__">
|
||||||
|
<label class="switch">
|
||||||
|
<input type="checkbox" checked>
|
||||||
|
<span class="slider round"></span>
|
||||||
|
</label>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<div class="small-description">__MSG_unsubmittedWarningDescription__</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<div option-type="toggle" sync-option="forceChannelCheck">
|
||||||
|
<label class="switch-container" label-name="__MSG_forceChannelCheck__">
|
||||||
|
<label class="switch">
|
||||||
|
<input type="checkbox" checked>
|
||||||
|
<span class="slider round"></span>
|
||||||
|
</label>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<div class="small-description">__MSG_whatForceChannelCheck__</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
<div option-type="toggle" toggle-type="reverse" sync-option="hideVideoPlayerControls">
|
<div option-type="toggle" toggle-type="reverse" sync-option="hideVideoPlayerControls">
|
||||||
<label class="switch-container" label-name="__MSG_showButtons__">
|
<label class="switch-container" label-name="__MSG_showButtons__">
|
||||||
<label class="switch">
|
<label class="switch">
|
||||||
@@ -237,6 +271,23 @@
|
|||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
|
<div option-type="toggle" sync-option="showTimeWithSkips">
|
||||||
|
<label class="switch-container" label-name="__MSG_showTimeWithSkips__">
|
||||||
|
<label class="switch">
|
||||||
|
<input type="checkbox" checked>
|
||||||
|
<span class="slider round"></span>
|
||||||
|
</label>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<div class="small-description">__MSG_showTimeWithSkipsDescription__</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
<div option-type="toggle" sync-option="trackViewCount">
|
<div option-type="toggle" sync-option="trackViewCount">
|
||||||
<label class="switch-container" label-name="__MSG_enableViewTracking__">
|
<label class="switch-container" label-name="__MSG_enableViewTracking__">
|
||||||
<label class="switch">
|
<label class="switch">
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div id="app" class="popupBody sponsorBlockPageBody">
|
<div id="app" class="popupBody sponsorBlockPageBody">
|
||||||
<h1 class="popupElement logoText">
|
<h1 class="popupElement logoText">
|
||||||
<img src="icons/IconSponsorBlocker256px.png" height="32px" id="sponsorBlockPopupLogo"/>
|
<img src="icons/IconSponsorBlocker256px.png" height="32px" id="sponsorBlockPopupLogo"/>
|
||||||
__MSG_Name__
|
SponsorBlock
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<!-- Loading text -->
|
<!-- Loading text -->
|
||||||
|
|||||||
@@ -40,21 +40,6 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return true;
|
|
||||||
case "addSponsorTime":
|
|
||||||
addSponsorTime(request.time, request.videoID, callback);
|
|
||||||
|
|
||||||
//this allows the callback to be called later
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case "getSponsorTimes":
|
|
||||||
getSponsorTimes(request.videoID, function(sponsorTimes) {
|
|
||||||
callback({
|
|
||||||
sponsorTimes
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
//this allows the callback to be called later
|
|
||||||
return true;
|
return true;
|
||||||
case "submitVote":
|
case "submitVote":
|
||||||
submitVote(request.type, request.UUID, request.category).then(callback);
|
submitVote(request.type, request.UUID, request.category).then(callback);
|
||||||
@@ -62,12 +47,14 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
|||||||
//this allows the callback to be called later
|
//this allows the callback to be called later
|
||||||
return true;
|
return true;
|
||||||
case "alertPrevious":
|
case "alertPrevious":
|
||||||
chrome.notifications.create("stillThere" + Math.random(), {
|
if (Config.config.unsubmittedWarning) {
|
||||||
type: "basic",
|
chrome.notifications.create("stillThere" + Math.random(), {
|
||||||
title: chrome.i18n.getMessage("wantToSubmit") + " " + request.previousVideoID + "?",
|
type: "basic",
|
||||||
message: chrome.i18n.getMessage("leftTimes"),
|
title: chrome.i18n.getMessage("wantToSubmit") + " " + request.previousVideoID + "?",
|
||||||
iconUrl: "./icons/LogoSponsorBlocker256px.png"
|
message: chrome.i18n.getMessage("leftTimes"),
|
||||||
});
|
iconUrl: "./icons/LogoSponsorBlocker256px.png"
|
||||||
|
});
|
||||||
|
}
|
||||||
case "registerContentScript":
|
case "registerContentScript":
|
||||||
registerFirefoxContentScript(request);
|
registerFirefoxContentScript(request);
|
||||||
return false;
|
return false;
|
||||||
@@ -125,38 +112,6 @@ function unregisterFirefoxContentScript(id: string) {
|
|||||||
delete contentScriptRegistrations[id];
|
delete contentScriptRegistrations[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
//gets the sponsor times from memory
|
|
||||||
function getSponsorTimes(videoID, callback) {
|
|
||||||
let sponsorTimes = [];
|
|
||||||
let sponsorTimesStorage = Config.config.sponsorTimes.get(videoID);
|
|
||||||
|
|
||||||
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
|
|
||||||
sponsorTimes = sponsorTimesStorage;
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(sponsorTimes);
|
|
||||||
}
|
|
||||||
|
|
||||||
function addSponsorTime(time, videoID, callback) {
|
|
||||||
getSponsorTimes(videoID, function(sponsorTimes) {
|
|
||||||
//add to sponsorTimes
|
|
||||||
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length < 2) {
|
|
||||||
//it is an end time
|
|
||||||
sponsorTimes[sponsorTimes.length - 1][1] = time;
|
|
||||||
} else {
|
|
||||||
//it is a start time
|
|
||||||
let sponsorTimesIndex = sponsorTimes.length;
|
|
||||||
sponsorTimes[sponsorTimesIndex] = [];
|
|
||||||
|
|
||||||
sponsorTimes[sponsorTimesIndex][0] = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
//save this info
|
|
||||||
Config.config.sponsorTimes.set(videoID, sponsorTimes);
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function submitVote(type: number, UUID: string, category: string) {
|
async function submitVote(type: number, UUID: string, category: string) {
|
||||||
let userID = Config.config.userID;
|
let userID = Config.config.userID;
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,26 @@ class CategoryChooserComponent extends React.Component<CategoryChooserProps, Cat
|
|||||||
<table id="categoryChooserTable"
|
<table id="categoryChooserTable"
|
||||||
className="categoryChooserTable">
|
className="categoryChooserTable">
|
||||||
<tbody>
|
<tbody>
|
||||||
|
{/* Headers */}
|
||||||
|
<tr id={"CategoryOptionsRow"}
|
||||||
|
className="categoryTableElement categoryTableHeader">
|
||||||
|
<td id={"CategoryOptionName"}>
|
||||||
|
{chrome.i18n.getMessage("category")}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td id={"CategorySkipOption"}>
|
||||||
|
{chrome.i18n.getMessage("skipOption")}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td id={"CategoryColorOption"}>
|
||||||
|
{chrome.i18n.getMessage("seekBarColor")}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td id={"CategoryPreviewColorOption"}>
|
||||||
|
{chrome.i18n.getMessage("previewColor")}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
{this.getCategorySkipOptions()}
|
{this.getCategorySkipOptions()}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -40,7 +60,6 @@ class CategoryChooserComponent extends React.Component<CategoryChooserProps, Cat
|
|||||||
for (const category of CompileConfig.categoryList) {
|
for (const category of CompileConfig.categoryList) {
|
||||||
elements.push(
|
elements.push(
|
||||||
<CategorySkipOptionsComponent category={category}
|
<CategorySkipOptionsComponent category={category}
|
||||||
defaultColor={"00d400"}
|
|
||||||
key={category}>
|
key={category}>
|
||||||
</CategorySkipOptionsComponent>
|
</CategorySkipOptionsComponent>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,14 +2,19 @@ import * as React from "react";
|
|||||||
|
|
||||||
import Config from "../config"
|
import Config from "../config"
|
||||||
import { CategorySkipOption } from "../types";
|
import { CategorySkipOption } from "../types";
|
||||||
|
import Utils from "../utils";
|
||||||
|
|
||||||
|
const utils = new Utils();
|
||||||
|
|
||||||
export interface CategorySkipOptionsProps {
|
export interface CategorySkipOptionsProps {
|
||||||
category: string;
|
category: string;
|
||||||
defaultColor: string;
|
defaultColor?: string;
|
||||||
|
defaultPreviewColor?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CategorySkipOptionsState {
|
export interface CategorySkipOptionsState {
|
||||||
color: string;
|
color: string;
|
||||||
|
previewColor: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsProps, CategorySkipOptionsState> {
|
class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsProps, CategorySkipOptionsState> {
|
||||||
@@ -19,7 +24,8 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
|||||||
|
|
||||||
// Setup state
|
// Setup state
|
||||||
this.state = {
|
this.state = {
|
||||||
color: props.defaultColor
|
color: props.defaultColor || Config.config.barTypes[this.props.category].color,
|
||||||
|
previewColor: props.defaultPreviewColor || Config.config.barTypes["preview-" + this.props.category].color,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,28 +45,65 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
|||||||
defaultOption = "autoSkip";
|
defaultOption = "autoSkip";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr id={this.props.category + "OptionsRow"}
|
<>
|
||||||
className="categoryTableElement">
|
<tr id={this.props.category + "OptionsRow"}
|
||||||
<td id={this.props.category + "OptionName"}
|
className="categoryTableElement">
|
||||||
className="categoryTableLabel">
|
<td id={this.props.category + "OptionName"}
|
||||||
{chrome.i18n.getMessage("category_" + this.props.category)}
|
className="categoryTableLabel">
|
||||||
</td>
|
{chrome.i18n.getMessage("category_" + this.props.category)}
|
||||||
|
</td>
|
||||||
|
|
||||||
<td id={this.props.category + "SkipOption"}>
|
<td id={this.props.category + "SkipOption"}>
|
||||||
<select
|
<select
|
||||||
className="categoryOptionsSelector"
|
className="categoryOptionsSelector"
|
||||||
defaultValue={defaultOption}
|
defaultValue={defaultOption}
|
||||||
onChange={this.skipOptionSelected.bind(this)}>
|
onChange={this.skipOptionSelected.bind(this)}>
|
||||||
{this.getCategorySkipOptions()}
|
{this.getCategorySkipOptions()}
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
{/* TODO: Add colour chooser */}
|
<td id={this.props.category + "ColorOption"}>
|
||||||
</tr>
|
<input
|
||||||
|
className="categoryColorTextBox option-text-box"
|
||||||
|
type="text"
|
||||||
|
onChange={(event) => this.setColorState(event, false)}
|
||||||
|
value={this.state.color} />
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td id={this.props.category + "PreviewColorOption"}>
|
||||||
|
<input
|
||||||
|
className="categoryColorTextBox option-text-box"
|
||||||
|
type="text"
|
||||||
|
onChange={(event) => this.setColorState(event, true)}
|
||||||
|
value={this.state.previewColor} />
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td id={this.props.category + "SaveButton"}>
|
||||||
|
<div
|
||||||
|
className="option-button trigger-button"
|
||||||
|
onClick={() => this.save()}>
|
||||||
|
{chrome.i18n.getMessage("save")}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr id={this.props.category + "DescriptionRow"}
|
||||||
|
className="small-description">
|
||||||
|
<td
|
||||||
|
colSpan={2}>
|
||||||
|
{chrome.i18n.getMessage("category_" + this.props.category + "_description")}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +155,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
|||||||
|
|
||||||
getCategorySkipOptions(): JSX.Element[] {
|
getCategorySkipOptions(): JSX.Element[] {
|
||||||
let elements: JSX.Element[] = [];
|
let elements: JSX.Element[] = [];
|
||||||
""
|
|
||||||
let optionNames = ["disable", "showOverlay", "manualSkip", "autoSkip"];
|
let optionNames = ["disable", "showOverlay", "manualSkip", "autoSkip"];
|
||||||
|
|
||||||
for (const optionName of optionNames) {
|
for (const optionName of optionNames) {
|
||||||
@@ -125,6 +168,36 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
|||||||
|
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setColorState(event: React.ChangeEvent<HTMLInputElement>, preview: boolean) {
|
||||||
|
if (preview) {
|
||||||
|
this.setState({
|
||||||
|
previewColor: event.target.value
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.setState({
|
||||||
|
color: event.target.value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save text box data
|
||||||
|
save() {
|
||||||
|
// Validate colors
|
||||||
|
let checkVar = [this.state.color, this.state.previewColor]
|
||||||
|
for (const color of checkVar) {
|
||||||
|
if (color[0] !== "#" || (color.length !== 7 && color.length !== 4) || !utils.isHex(color.slice(1))) {
|
||||||
|
alert(chrome.i18n.getMessage("colorFormatIncorrect") + " " + color.slice(1) + " " + utils.isHex(color.slice(1)) + " " + utils.isHex("abcd123"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save colors
|
||||||
|
Config.config.barTypes[this.props.category].color = this.state.color;
|
||||||
|
Config.config.barTypes["preview-" + this.props.category].color = this.state.previewColor;
|
||||||
|
// Make listener get called
|
||||||
|
Config.config.barTypes = Config.config.barTypes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CategorySkipOptionsComponent;
|
export default CategorySkipOptionsComponent;
|
||||||
@@ -2,7 +2,8 @@ import * as React from "react";
|
|||||||
|
|
||||||
export interface NoticeTextSelectionProps {
|
export interface NoticeTextSelectionProps {
|
||||||
text: string,
|
text: string,
|
||||||
idSuffix: string
|
idSuffix: string,
|
||||||
|
onClick?: (event: React.MouseEvent) => any
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface NoticeTextSelectionState {
|
export interface NoticeTextSelectionState {
|
||||||
@@ -16,8 +17,16 @@ class NoticeTextSelectionComponent extends React.Component<NoticeTextSelectionPr
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
let style: React.CSSProperties = {};
|
||||||
|
if (this.props.onClick) {
|
||||||
|
style.cursor = "pointer";
|
||||||
|
style.textDecoration = "underline"
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<p id={"sponsorTimesInfoMessage" + this.props.idSuffix}
|
<p id={"sponsorTimesInfoMessage" + this.props.idSuffix}
|
||||||
|
onClick={this.props.onClick}
|
||||||
|
style={style}
|
||||||
className="sponsorTimesInfoMessage">
|
className="sponsorTimesInfoMessage">
|
||||||
{this.props.text}
|
{this.props.text}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export interface SkipNoticeState {
|
|||||||
noticeTitle: string;
|
noticeTitle: string;
|
||||||
|
|
||||||
messages: string[];
|
messages: string[];
|
||||||
|
messageOnClick: (event: React.MouseEvent) => any;
|
||||||
|
|
||||||
countdownTime: number;
|
countdownTime: number;
|
||||||
maxCountdownTime: () => number;
|
maxCountdownTime: () => number;
|
||||||
@@ -73,7 +74,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
this.contentContainer = props.contentContainer;
|
this.contentContainer = props.contentContainer;
|
||||||
this.audio = null;
|
this.audio = null;
|
||||||
|
|
||||||
let categoryName = chrome.i18n.getMessage(this.segments.length > 1 ? "multipleSegments" : "category_" + this.segments[0].category);
|
let categoryName = chrome.i18n.getMessage(this.segments.length > 1 ? "multipleSegments"
|
||||||
|
: "category_" + this.segments[0].category + "_short") || chrome.i18n.getMessage("category_" + this.segments[0].category);
|
||||||
let noticeTitle = categoryName + " " + chrome.i18n.getMessage("skipped");
|
let noticeTitle = categoryName + " " + chrome.i18n.getMessage("skipped");
|
||||||
if (!this.autoSkip) {
|
if (!this.autoSkip) {
|
||||||
noticeTitle = chrome.i18n.getMessage("skip") + " " + categoryName + "?";
|
noticeTitle = chrome.i18n.getMessage("skip") + " " + categoryName + "?";
|
||||||
@@ -104,6 +106,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
this.state = {
|
this.state = {
|
||||||
noticeTitle,
|
noticeTitle,
|
||||||
messages: [],
|
messages: [],
|
||||||
|
messageOnClick: null,
|
||||||
|
|
||||||
//the countdown until this notice closes
|
//the countdown until this notice closes
|
||||||
maxCountdownTime: () => 4,
|
maxCountdownTime: () => 4,
|
||||||
@@ -324,6 +327,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
elements.push(
|
elements.push(
|
||||||
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
|
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
|
||||||
text={this.state.messages[i]}
|
text={this.state.messages[i]}
|
||||||
|
onClick={this.state.messageOnClick}
|
||||||
key={i}>
|
key={i}>
|
||||||
</NoticeTextSelectionComponent>
|
</NoticeTextSelectionComponent>
|
||||||
)
|
)
|
||||||
@@ -504,6 +508,13 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setNoticeInfoMessageWithOnClick(onClick: (event: React.MouseEvent) => any, ...messages: string[]) {
|
||||||
|
this.setState({
|
||||||
|
messages,
|
||||||
|
messageOnClick: (event) => onClick(event)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
setNoticeInfoMessage(...messages: string[]) {
|
setNoticeInfoMessage(...messages: string[]) {
|
||||||
this.setState({
|
this.setState({
|
||||||
messages
|
messages
|
||||||
|
|||||||
@@ -182,14 +182,23 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
|||||||
{timeDisplay}
|
{timeDisplay}
|
||||||
|
|
||||||
{/* Category */}
|
{/* Category */}
|
||||||
|
<div style={{position: "relative"}}>
|
||||||
|
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||||
|
className="sponsorTimeCategories"
|
||||||
|
defaultValue={sponsorTime.category}
|
||||||
|
ref={this.categoryOptionRef}
|
||||||
|
onChange={this.categorySelectionChange.bind(this)}>
|
||||||
|
{this.getCategoryOptions()}
|
||||||
|
</select>
|
||||||
|
|
||||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
<img id={"sponsorTimeCategoriesHelpButton" + this.idSuffix}
|
||||||
className="sponsorTimeCategories"
|
className="helpButton"
|
||||||
defaultValue={sponsorTime.category}
|
src={chrome.extension.getURL("icons/help.svg")}
|
||||||
ref={this.categoryOptionRef}
|
title={chrome.i18n.getMessage("categoryGuidelines")}
|
||||||
onChange={this.categorySelectionChange.bind(this)}>
|
onClick={() => chrome.runtime.sendMessage({"message": "openConfig"})}>
|
||||||
{this.getCategoryOptions()}
|
|
||||||
</select>
|
</img>
|
||||||
|
</div>
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
@@ -313,7 +322,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
|||||||
|
|
||||||
sponsorTimesSubmitting[this.props.index].category = this.categoryOptionRef.current.value;
|
sponsorTimesSubmitting[this.props.index].category = this.categoryOptionRef.current.value;
|
||||||
|
|
||||||
Config.config.sponsorTimes.set(this.props.contentContainer().sponsorVideoID, utils.getSegmentsFromSponsorTimes(sponsorTimesSubmitting));
|
Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimesSubmitting);
|
||||||
|
|
||||||
this.props.contentContainer().updatePreviewBar();
|
this.props.contentContainer().updatePreviewBar();
|
||||||
}
|
}
|
||||||
@@ -345,7 +354,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
|||||||
sponsorTimes.splice(index, 1);
|
sponsorTimes.splice(index, 1);
|
||||||
|
|
||||||
//save this
|
//save this
|
||||||
Config.config.sponsorTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimes);
|
Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimes);
|
||||||
|
|
||||||
this.props.contentContainer().updatePreviewBar();
|
this.props.contentContainer().updatePreviewBar();
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,13 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
|||||||
<td className="sponsorSkipNoticeRightSection"
|
<td className="sponsorSkipNoticeRightSection"
|
||||||
style={{position: "relative"}}>
|
style={{position: "relative"}}>
|
||||||
|
|
||||||
|
{/* Guidelines button */}
|
||||||
|
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||||
|
onClick={() => window.open("https://github.com/ajayyy/SponsorBlock/wiki/Guidelines")}>
|
||||||
|
|
||||||
|
{chrome.i18n.getMessage(Config.config.submissionCountSinceCategories > 3 ? "guidelines" : "readTheGuidelines")}
|
||||||
|
</button>
|
||||||
|
|
||||||
{/* Submit Button */}
|
{/* Submit Button */}
|
||||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||||
onClick={this.submit.bind(this)}>
|
onClick={this.submit.bind(this)}>
|
||||||
|
|||||||
247
src/config.ts
247
src/config.ts
@@ -1,12 +1,13 @@
|
|||||||
import * as CompileConfig from "../config.json";
|
import * as CompileConfig from "../config.json";
|
||||||
import { CategorySelection, CategorySkipOption } from "./types";
|
import { CategorySelection, CategorySkipOption, PreviewBarOption, SponsorTime } from "./types";
|
||||||
|
|
||||||
import Utils from "./utils";
|
import Utils from "./utils";
|
||||||
const utils = new Utils();
|
const utils = new Utils();
|
||||||
|
|
||||||
interface SBConfig {
|
interface SBConfig {
|
||||||
userID: string,
|
userID: string,
|
||||||
sponsorTimes: SBMap<string, any>,
|
// sponsorTimes: SBMap<string, SponsorTime[]>,
|
||||||
|
segmentTimes: SBMap<string, SponsorTime[]>,
|
||||||
whitelistedChannels: string[],
|
whitelistedChannels: string[],
|
||||||
forceChannelCheck: boolean,
|
forceChannelCheck: boolean,
|
||||||
startSponsorKeybind: string,
|
startSponsorKeybind: string,
|
||||||
@@ -14,6 +15,9 @@ interface SBConfig {
|
|||||||
minutesSaved: number,
|
minutesSaved: number,
|
||||||
skipCount: number,
|
skipCount: number,
|
||||||
sponsorTimesContributed: number,
|
sponsorTimesContributed: number,
|
||||||
|
submissionCountSinceCategories: number, // New count used to show the "Read The Guidelines!!" message
|
||||||
|
showTimeWithSkips: boolean,
|
||||||
|
unsubmittedWarning: boolean,
|
||||||
disableSkipping: boolean,
|
disableSkipping: boolean,
|
||||||
trackViewCount: boolean,
|
trackViewCount: boolean,
|
||||||
dontShowNotice: boolean,
|
dontShowNotice: boolean,
|
||||||
@@ -29,11 +33,26 @@ interface SBConfig {
|
|||||||
minDuration: number,
|
minDuration: number,
|
||||||
audioNotificationOnSkip,
|
audioNotificationOnSkip,
|
||||||
checkForUnlistedVideos: boolean,
|
checkForUnlistedVideos: boolean,
|
||||||
mobileUpdateShowCount: number,
|
|
||||||
testingServer: boolean,
|
testingServer: boolean,
|
||||||
|
|
||||||
// What categories should be skipped
|
// What categories should be skipped
|
||||||
categorySelections: CategorySelection[]
|
categorySelections: CategorySelection[],
|
||||||
|
|
||||||
|
// Preview bar
|
||||||
|
barTypes: {
|
||||||
|
"sponsor": PreviewBarOption,
|
||||||
|
"preview-sponsor": PreviewBarOption,
|
||||||
|
"intro": PreviewBarOption,
|
||||||
|
"preview-intro": PreviewBarOption,
|
||||||
|
"outro": PreviewBarOption,
|
||||||
|
"preview-outro": PreviewBarOption,
|
||||||
|
"interaction": PreviewBarOption,
|
||||||
|
"preview-interaction": PreviewBarOption,
|
||||||
|
"selfpromo": PreviewBarOption,
|
||||||
|
"preview-selfpromo": PreviewBarOption,
|
||||||
|
"music_offtopic": PreviewBarOption,
|
||||||
|
"preview-music_offtopic": PreviewBarOption,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SBObject {
|
interface SBObject {
|
||||||
@@ -65,35 +84,39 @@ class SBMap<T, U> extends Map {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set(key, value) {
|
get(key): U {
|
||||||
const result = super.set(key, value);
|
return super.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
rawSet(key, value) {
|
||||||
|
return super.set(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
// Store updated SBMap locally
|
// Store updated SBMap locally
|
||||||
chrome.storage.sync.set({
|
chrome.storage.sync.set({
|
||||||
[this.id]: encodeStoredItem(this)
|
[this.id]: encodeStoredItem(this)
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
set(key: T, value: U) {
|
||||||
|
const result = super.set(key, value);
|
||||||
|
|
||||||
|
this.update();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(key) {
|
delete(key) {
|
||||||
const result = super.delete(key);
|
const result = super.delete(key);
|
||||||
|
|
||||||
// Store updated SBMap locally
|
this.update();
|
||||||
chrome.storage.sync.set({
|
|
||||||
[this.id]: encodeStoredItem(this)
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
const result = super.clear();
|
const result = super.clear();
|
||||||
|
|
||||||
chrome.storage.sync.set({
|
this.update();
|
||||||
[this.id]: encodeStoredItem(this)
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,7 +128,7 @@ var Config: SBObject = {
|
|||||||
configListeners: [],
|
configListeners: [],
|
||||||
defaults: {
|
defaults: {
|
||||||
userID: null,
|
userID: null,
|
||||||
sponsorTimes: new SBMap("sponsorTimes"),
|
segmentTimes: new SBMap("segmentTimes"),
|
||||||
whitelistedChannels: [],
|
whitelistedChannels: [],
|
||||||
forceChannelCheck: false,
|
forceChannelCheck: false,
|
||||||
startSponsorKeybind: ";",
|
startSponsorKeybind: ";",
|
||||||
@@ -113,6 +136,9 @@ var Config: SBObject = {
|
|||||||
minutesSaved: 0,
|
minutesSaved: 0,
|
||||||
skipCount: 0,
|
skipCount: 0,
|
||||||
sponsorTimesContributed: 0,
|
sponsorTimesContributed: 0,
|
||||||
|
submissionCountSinceCategories: 0,
|
||||||
|
showTimeWithSkips: true,
|
||||||
|
unsubmittedWarning: true,
|
||||||
disableSkipping: false,
|
disableSkipping: false,
|
||||||
trackViewCount: true,
|
trackViewCount: true,
|
||||||
dontShowNotice: false,
|
dontShowNotice: false,
|
||||||
@@ -128,13 +154,64 @@ var Config: SBObject = {
|
|||||||
minDuration: 0,
|
minDuration: 0,
|
||||||
audioNotificationOnSkip: false,
|
audioNotificationOnSkip: false,
|
||||||
checkForUnlistedVideos: false,
|
checkForUnlistedVideos: false,
|
||||||
mobileUpdateShowCount: 0,
|
|
||||||
testingServer: false,
|
testingServer: false,
|
||||||
|
|
||||||
categorySelections: [{
|
categorySelections: [{
|
||||||
name: "sponsor",
|
name: "sponsor",
|
||||||
option: CategorySkipOption.AutoSkip
|
option: CategorySkipOption.AutoSkip
|
||||||
}]
|
}],
|
||||||
|
|
||||||
|
// Preview bar
|
||||||
|
barTypes: {
|
||||||
|
"sponsor": {
|
||||||
|
color: "#00d400",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"preview-sponsor": {
|
||||||
|
color: "#007800",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"intro": {
|
||||||
|
color: "#00ffff",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"preview-intro": {
|
||||||
|
color: "#008080",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"outro": {
|
||||||
|
color: "#0202ed",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"preview-outro": {
|
||||||
|
color: "#000070",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"interaction": {
|
||||||
|
color: "#cc00ff",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"preview-interaction": {
|
||||||
|
color: "#6c0087",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"selfpromo": {
|
||||||
|
color: "#ffff00",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"preview-selfpromo": {
|
||||||
|
color: "#bfbf35",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"music_offtopic": {
|
||||||
|
color: "#ff9900",
|
||||||
|
opacity: "0.7"
|
||||||
|
},
|
||||||
|
"preview-music_offtopic": {
|
||||||
|
color: "#a6634a",
|
||||||
|
opacity: "0.7"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
localConfig: null,
|
localConfig: null,
|
||||||
config: null,
|
config: null,
|
||||||
@@ -164,24 +241,13 @@ function encodeStoredItem<T>(data: T): T | Array<any> {
|
|||||||
*
|
*
|
||||||
* @param {*} data
|
* @param {*} data
|
||||||
*/
|
*/
|
||||||
function decodeStoredItem<T>(id: string, data: T): T | SBMap<string, any> {
|
function decodeStoredItem<T>(id: string, data: T): T | SBMap<string, SponsorTime[]> {
|
||||||
if (!Config.defaults[id]) return data;
|
if (!Config.defaults[id]) return data;
|
||||||
|
|
||||||
if (Config.defaults[id] instanceof SBMap) {
|
if (Config.defaults[id] instanceof SBMap) {
|
||||||
try {
|
try {
|
||||||
let jsonData: any = data;
|
if (!Array.isArray(data)) return data;
|
||||||
|
return new SBMap(id, data);
|
||||||
// Check if data is stored in the old format for SBMap (a JSON string)
|
|
||||||
if (typeof data === "string") {
|
|
||||||
try {
|
|
||||||
jsonData = JSON.parse(data);
|
|
||||||
} catch(e) {
|
|
||||||
// Continue normally (out of this if statement)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Array.isArray(jsonData)) return data;
|
|
||||||
return new SBMap(id, jsonData);
|
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.error("Failed to parse SBMap: " + id);
|
console.error("Failed to parse SBMap: " + id);
|
||||||
}
|
}
|
||||||
@@ -239,9 +305,9 @@ function fetchConfig() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function migrateOldFormats() {
|
function migrateOldFormats(config: SBConfig) {
|
||||||
if (Config.config["disableAutoSkip"]) {
|
if (config["disableAutoSkip"]) {
|
||||||
for (const selection of Config.config.categorySelections) {
|
for (const selection of config.categorySelections) {
|
||||||
if (selection.name === "sponsor") {
|
if (selection.name === "sponsor") {
|
||||||
selection.option = CategorySkipOption.ManualSkip;
|
selection.option = CategorySkipOption.ManualSkip;
|
||||||
|
|
||||||
@@ -251,57 +317,108 @@ async function migrateOldFormats() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Auto vote removal
|
// Auto vote removal
|
||||||
if (Config.config["autoUpvote"]) {
|
if (config["autoUpvote"]) {
|
||||||
chrome.storage.sync.remove("autoUpvote");
|
chrome.storage.sync.remove("autoUpvote");
|
||||||
}
|
}
|
||||||
|
// mobileUpdateShowCount removal
|
||||||
|
if (config["mobileUpdateShowCount"] !== undefined) {
|
||||||
|
chrome.storage.sync.remove("mobileUpdateShowCount");
|
||||||
|
}
|
||||||
|
// categoryUpdateShowCount removal
|
||||||
|
if (config["categoryUpdateShowCount"] !== undefined) {
|
||||||
|
chrome.storage.sync.remove("categoryUpdateShowCount");
|
||||||
|
}
|
||||||
|
|
||||||
// Channel URLS
|
// Channel URLS
|
||||||
if (Config.config.whitelistedChannels.length > 0 &&
|
if (config.whitelistedChannels.length > 0 &&
|
||||||
(Config.config.whitelistedChannels[0] == null || Config.config.whitelistedChannels[0].includes("/"))) {
|
(config.whitelistedChannels[0] == null || config.whitelistedChannels[0].includes("/"))) {
|
||||||
let newChannelList: string[] = [];
|
const channelURLFixer = async() => {
|
||||||
for (const item of Config.config.whitelistedChannels) {
|
let newChannelList: string[] = [];
|
||||||
if (item != null) {
|
for (const item of config.whitelistedChannels) {
|
||||||
if (item.includes("/channel/")) {
|
if (item != null) {
|
||||||
newChannelList.push(item.split("/")[2]);
|
if (item.includes("/channel/")) {
|
||||||
} else if (item.includes("/user/") && utils.isContentScript()) {
|
newChannelList.push(item.split("/")[2]);
|
||||||
// Replace channel URL with channelID
|
} else if (item.includes("/user/") && utils.isContentScript()) {
|
||||||
let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
|
|
||||||
|
|
||||||
if (response.ok) {
|
|
||||||
newChannelList.push((JSON.parse(response.responseText)).authorId);
|
// Replace channel URL with channelID
|
||||||
} else {
|
let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
|
||||||
// Add it at the beginning so it gets converted later
|
|
||||||
|
if (response.ok) {
|
||||||
|
newChannelList.push((JSON.parse(response.responseText)).authorId);
|
||||||
|
} else {
|
||||||
|
// Add it at the beginning so it gets converted later
|
||||||
|
newChannelList.unshift(item);
|
||||||
|
}
|
||||||
|
} else if (item.includes("/user/")) {
|
||||||
|
// Add it at the beginning so it gets converted later (The API can only be called in the content script due to CORS issues)
|
||||||
newChannelList.unshift(item);
|
newChannelList.unshift(item);
|
||||||
|
} else {
|
||||||
|
newChannelList.push(item);
|
||||||
}
|
}
|
||||||
} else if (item.includes("/user/")) {
|
|
||||||
// Add it at the beginning so it gets converted later (The API can only be called in the content script due to CORS issues)
|
|
||||||
newChannelList.unshift(item);
|
|
||||||
} else {
|
|
||||||
newChannelList.push(item);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config.whitelistedChannels = newChannelList;
|
||||||
}
|
}
|
||||||
|
|
||||||
Config.config.whitelistedChannels = newChannelList;
|
channelURLFixer();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if off-topic category needs to be removed
|
// Check if off-topic category needs to be removed
|
||||||
for (let i = 0; i < Config.config.categorySelections.length; i++) {
|
for (let i = 0; i < config.categorySelections.length; i++) {
|
||||||
if (Config.config.categorySelections[i].name === "offtopic") {
|
if (config.categorySelections[i].name === "offtopic") {
|
||||||
Config.config.categorySelections.splice(i, 1);
|
config.categorySelections.splice(i, 1);
|
||||||
// Call set listener
|
// Call set listener
|
||||||
Config.config.categorySelections = Config.config.categorySelections;
|
config.categorySelections = config.categorySelections;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Migrate old "sponsorTimes"
|
||||||
|
if (config["sponsorTimes"]) {
|
||||||
|
let jsonData: any = config["sponsorTimes"];
|
||||||
|
|
||||||
|
// Check if data is stored in the old format for SBMap (a JSON string)
|
||||||
|
if (typeof jsonData === "string") {
|
||||||
|
try {
|
||||||
|
jsonData = JSON.parse(jsonData);
|
||||||
|
} catch(e) {
|
||||||
|
// Continue normally (out of this if statement)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise junk data
|
||||||
|
if (Array.isArray(jsonData)) {
|
||||||
|
let oldMap = new Map(jsonData);
|
||||||
|
oldMap.forEach((sponsorTimes: number[][], key) => {
|
||||||
|
let segmentTimes: SponsorTime[] = [];
|
||||||
|
for (const segment of sponsorTimes) {
|
||||||
|
segmentTimes.push({
|
||||||
|
segment: segment,
|
||||||
|
category: "sponsor",
|
||||||
|
UUID: null
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
config.segmentTimes.rawSet(key, segmentTimes);
|
||||||
|
});
|
||||||
|
|
||||||
|
config.segmentTimes.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
chrome.storage.sync.remove("sponsorTimes");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setupConfig() {
|
async function setupConfig() {
|
||||||
await fetchConfig();
|
await fetchConfig();
|
||||||
addDefaults();
|
addDefaults();
|
||||||
convertJSON();
|
convertJSON();
|
||||||
Config.config = configProxy();
|
const config = configProxy();
|
||||||
migrateOldFormats();
|
migrateOldFormats(config);
|
||||||
|
|
||||||
|
Config.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset config
|
// Reset config
|
||||||
@@ -320,6 +437,12 @@ function addDefaults() {
|
|||||||
for (const key in Config.defaults) {
|
for (const key in Config.defaults) {
|
||||||
if(!Config.localConfig.hasOwnProperty(key)) {
|
if(!Config.localConfig.hasOwnProperty(key)) {
|
||||||
Config.localConfig[key] = Config.defaults[key];
|
Config.localConfig[key] = Config.defaults[key];
|
||||||
|
} else if (key === "barTypes") {
|
||||||
|
for (const key2 in Config.defaults[key]) {
|
||||||
|
if(!Config.localConfig[key].hasOwnProperty(key2)) {
|
||||||
|
Config.localConfig[key][key2] = Config.defaults[key][key2];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -323,13 +323,13 @@ async function videoIDChange(id) {
|
|||||||
//warn them if they had unsubmitted times
|
//warn them if they had unsubmitted times
|
||||||
if (previousVideoID != null) {
|
if (previousVideoID != null) {
|
||||||
//get the sponsor times from storage
|
//get the sponsor times from storage
|
||||||
let sponsorTimes = Config.config.sponsorTimes.get(previousVideoID);
|
let sponsorTimes = Config.config.segmentTimes.get(previousVideoID);
|
||||||
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
||||||
//warn them that they have unsubmitted sponsor times
|
//warn them that they have unsubmitted sponsor times
|
||||||
chrome.runtime.sendMessage({
|
chrome.runtime.sendMessage({
|
||||||
message: "alertPrevious",
|
message: "alertPrevious",
|
||||||
previousVideoID: previousVideoID
|
previousVideoID: previousVideoID
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//set the previous video id to the currentID
|
//set the previous video id to the currentID
|
||||||
@@ -347,10 +347,10 @@ async function videoIDChange(id) {
|
|||||||
//make sure everything is properly added
|
//make sure everything is properly added
|
||||||
updateVisibilityOfPlayerControlsButton().then(() => {
|
updateVisibilityOfPlayerControlsButton().then(() => {
|
||||||
//see if the onvideo control image needs to be changed
|
//see if the onvideo control image needs to be changed
|
||||||
let segments = Config.config.sponsorTimes.get(sponsorVideoID);
|
let segments = Config.config.segmentTimes.get(sponsorVideoID);
|
||||||
if (segments != null && segments.length > 0 && segments[segments.length - 1].length >= 2) {
|
if (segments != null && segments.length > 0 && segments[segments.length - 1].segment.length >= 2) {
|
||||||
changeStartSponsorButton(true, true);
|
changeStartSponsorButton(true, true);
|
||||||
} else if (segments != null && segments.length > 0 && segments[segments.length - 1].length < 2) {
|
} else if (segments != null && segments.length > 0 && segments[segments.length - 1].segment.length < 2) {
|
||||||
changeStartSponsorButton(false, true);
|
changeStartSponsorButton(false, true);
|
||||||
} else {
|
} else {
|
||||||
changeStartSponsorButton(true, false);
|
changeStartSponsorButton(true, false);
|
||||||
@@ -818,6 +818,10 @@ function updatePreviewBar() {
|
|||||||
|
|
||||||
previewBar.set(utils.getSegmentsFromSponsorTimes(allSponsorTimes), types, video.duration)
|
previewBar.set(utils.getSegmentsFromSponsorTimes(allSponsorTimes), types, video.duration)
|
||||||
|
|
||||||
|
if (Config.config.showTimeWithSkips) {
|
||||||
|
showTimeWithoutSkips(allSponsorTimes);
|
||||||
|
}
|
||||||
|
|
||||||
//update last video id
|
//update last video id
|
||||||
lastPreviewBarUpdate = sponsorVideoID;
|
lastPreviewBarUpdate = sponsorVideoID;
|
||||||
}
|
}
|
||||||
@@ -973,7 +977,7 @@ function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: S
|
|||||||
if (openNotice) {
|
if (openNotice) {
|
||||||
//send out the message saying that a sponsor message was skipped
|
//send out the message saying that a sponsor message was skipped
|
||||||
if (!Config.config.dontShowNotice || !autoSkip) {
|
if (!Config.config.dontShowNotice || !autoSkip) {
|
||||||
let skipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer);
|
new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1169,31 +1173,24 @@ function startSponsorClicked() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create raw segment list
|
|
||||||
let segments: number[][] = [];
|
|
||||||
for (const sponsorTime of sponsorTimesSubmitting) {
|
|
||||||
segments.push(sponsorTime.segment);
|
|
||||||
}
|
|
||||||
|
|
||||||
//save this info
|
//save this info
|
||||||
Config.config.sponsorTimes.set(sponsorVideoID, segments);
|
Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
|
||||||
|
|
||||||
updateSponsorTimesSubmitting(false)
|
updateSponsorTimesSubmitting(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateSponsorTimesSubmitting(getFromConfig: boolean = true) {
|
function updateSponsorTimesSubmitting(getFromConfig: boolean = true) {
|
||||||
let segments = Config.config.sponsorTimes.get(sponsorVideoID);
|
let segmentTimes = Config.config.segmentTimes.get(sponsorVideoID);
|
||||||
|
|
||||||
//see if this data should be saved in the sponsorTimesSubmitting variable
|
//see if this data should be saved in the sponsorTimesSubmitting variable
|
||||||
if (getFromConfig && segments != undefined) {
|
if (getFromConfig && segmentTimes != undefined) {
|
||||||
sponsorTimesSubmitting = [];
|
sponsorTimesSubmitting = [];
|
||||||
|
|
||||||
for (const segment of segments) {
|
for (const segmentTime of segmentTimes) {
|
||||||
sponsorTimesSubmitting.push({
|
sponsorTimesSubmitting.push({
|
||||||
segment: segment,
|
segment: segmentTime.segment,
|
||||||
UUID: null,
|
UUID: null,
|
||||||
// Default to sponsor
|
category: segmentTime.category
|
||||||
category: "sponsor"
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1317,7 +1314,7 @@ function clearSponsorTimes() {
|
|||||||
|
|
||||||
let currentVideoID = sponsorVideoID;
|
let currentVideoID = sponsorVideoID;
|
||||||
|
|
||||||
let sponsorTimes = Config.config.sponsorTimes.get(currentVideoID);
|
let sponsorTimes = Config.config.segmentTimes.get(currentVideoID);
|
||||||
|
|
||||||
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
||||||
let confirmMessage = chrome.i18n.getMessage("clearThis") + getSegmentsMessage(sponsorTimes)
|
let confirmMessage = chrome.i18n.getMessage("clearThis") + getSegmentsMessage(sponsorTimes)
|
||||||
@@ -1325,7 +1322,7 @@ function clearSponsorTimes() {
|
|||||||
if(!confirm(confirmMessage)) return;
|
if(!confirm(confirmMessage)) return;
|
||||||
|
|
||||||
//clear the sponsor times
|
//clear the sponsor times
|
||||||
Config.config.sponsorTimes.delete(currentVideoID);
|
Config.config.segmentTimes.delete(currentVideoID);
|
||||||
|
|
||||||
//clear sponsor times submitting
|
//clear sponsor times submitting
|
||||||
sponsorTimesSubmitting = [];
|
sponsorTimesSubmitting = [];
|
||||||
@@ -1447,14 +1444,14 @@ async function sendSubmitMessage(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//update sponsorTimes
|
//update sponsorTimes
|
||||||
Config.config.sponsorTimes.set(sponsorVideoID, utils.getSegmentsFromSponsorTimes(sponsorTimesSubmitting));
|
Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
|
||||||
|
|
||||||
// Check to see if any of the submissions are below the minimum duration set
|
// Check to see if any of the submissions are below the minimum duration set
|
||||||
if (Config.config.minDuration > 0) {
|
if (Config.config.minDuration > 0) {
|
||||||
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
|
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
|
||||||
if (sponsorTimesSubmitting[i].segment[1] - sponsorTimesSubmitting[i].segment[0] < Config.config.minDuration) {
|
if (sponsorTimesSubmitting[i].segment[1] - sponsorTimesSubmitting[i].segment[0] < Config.config.minDuration) {
|
||||||
let confirmShort = chrome.i18n.getMessage("shortCheck") + "\n\n" +
|
let confirmShort = chrome.i18n.getMessage("shortCheck") + "\n\n" +
|
||||||
getSegmentsMessage(utils.getSegmentsFromSponsorTimes(sponsorTimesSubmitting));
|
getSegmentsMessage(sponsorTimesSubmitting);
|
||||||
|
|
||||||
if(!confirm(confirmShort)) return;
|
if(!confirm(confirmShort)) return;
|
||||||
}
|
}
|
||||||
@@ -1484,7 +1481,7 @@ async function sendSubmitMessage(){
|
|||||||
submitButton.addEventListener("animationend", animationEndListener);
|
submitButton.addEventListener("animationend", animationEndListener);
|
||||||
|
|
||||||
//clear the sponsor times
|
//clear the sponsor times
|
||||||
Config.config.sponsorTimes.delete(sponsorVideoID);
|
Config.config.segmentTimes.delete(sponsorVideoID);
|
||||||
|
|
||||||
//add submissions to current sponsors list
|
//add submissions to current sponsors list
|
||||||
if (sponsorTimes === null) sponsorTimes = [];
|
if (sponsorTimes === null) sponsorTimes = [];
|
||||||
@@ -1494,6 +1491,10 @@ async function sendSubmitMessage(){
|
|||||||
// Increase contribution count
|
// Increase contribution count
|
||||||
Config.config.sponsorTimesContributed = Config.config.sponsorTimesContributed + sponsorTimesSubmitting.length;
|
Config.config.sponsorTimesContributed = Config.config.sponsorTimesContributed + sponsorTimesSubmitting.length;
|
||||||
|
|
||||||
|
// New count just used to see if a warning "Read The Guidelines!!" message needs to be shown
|
||||||
|
// One per time submitting
|
||||||
|
Config.config.submissionCountSinceCategories = Config.config.submissionCountSinceCategories + 1;
|
||||||
|
|
||||||
// Empty the submitting times
|
// Empty the submitting times
|
||||||
sponsorTimesSubmitting = [];
|
sponsorTimesSubmitting = [];
|
||||||
|
|
||||||
@@ -1508,12 +1509,12 @@ async function sendSubmitMessage(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//get the message that visually displays the video times
|
//get the message that visually displays the video times
|
||||||
function getSegmentsMessage(segments: number[][]): string {
|
function getSegmentsMessage(sponsorTimes: SponsorTime[]): string {
|
||||||
let sponsorTimesMessage = "";
|
let sponsorTimesMessage = "";
|
||||||
|
|
||||||
for (let i = 0; i < segments.length; i++) {
|
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||||
for (let s = 0; s < segments[i].length; s++) {
|
for (let s = 0; s < sponsorTimes[i].segment.length; s++) {
|
||||||
let timeMessage = utils.getFormattedTime(segments[i][s]);
|
let timeMessage = utils.getFormattedTime(sponsorTimes[i].segment[s]);
|
||||||
//if this is an end time
|
//if this is an end time
|
||||||
if (s == 1) {
|
if (s == 1) {
|
||||||
timeMessage = " to " + timeMessage;
|
timeMessage = " to " + timeMessage;
|
||||||
@@ -1589,3 +1590,36 @@ function updateAdFlag() {
|
|||||||
updateVisibilityOfPlayerControlsButton();
|
updateVisibilityOfPlayerControlsButton();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showTimeWithoutSkips(allSponsorTimes): void {
|
||||||
|
let skipDuration = 0;
|
||||||
|
|
||||||
|
// Calculate skipDuration based from the segments in the preview bar
|
||||||
|
for (let i = 0; i < allSponsorTimes.length; i++) {
|
||||||
|
// If an end time exists
|
||||||
|
if (allSponsorTimes[i].segment[1]) {
|
||||||
|
skipDuration += allSponsorTimes[i].segment[1] - allSponsorTimes[i].segment[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// YouTube player time display
|
||||||
|
let display = document.getElementsByClassName("ytp-time-display notranslate")[0];
|
||||||
|
if (display === undefined) return
|
||||||
|
|
||||||
|
let formatedTime = utils.getFormattedTime(video.duration - skipDuration);
|
||||||
|
|
||||||
|
const durationID = "sponsorBlockDurationAfterSkips";
|
||||||
|
let duration = document.getElementById(durationID);
|
||||||
|
|
||||||
|
// Create span if needed
|
||||||
|
if(duration === null) {
|
||||||
|
duration = document.createElement('span');
|
||||||
|
duration.id = durationID;
|
||||||
|
duration.classList.add("ytp-time-duration");
|
||||||
|
|
||||||
|
display.appendChild(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
duration.innerText = (skipDuration <= 0 || isNaN(skipDuration)) ? "" : " ("+formatedTime+")";
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,60 +5,9 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
let barTypes = {
|
import Config from "../config";
|
||||||
"undefined": {
|
import Utils from "../utils";
|
||||||
color: "#00d400",
|
let utils = new Utils();
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"sponsor": {
|
|
||||||
color: "#00d400",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"preview-sponsor": {
|
|
||||||
color: "#007800",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"intro": {
|
|
||||||
color: "#00ffff",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"preview-intro": {
|
|
||||||
color: "#008080",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"outro": {
|
|
||||||
color: "#0202ed",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"preview-outro": {
|
|
||||||
color: "#000070",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"interaction": {
|
|
||||||
color: "#cc00ff",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"preview-interaction": {
|
|
||||||
color: "#6c0087",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"selfpromo": {
|
|
||||||
color: "#ffff00",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"preview-selfpromo": {
|
|
||||||
color: "#bfbf35",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"music_offtopic": {
|
|
||||||
color: "#ff9900",
|
|
||||||
opacity: "0.7"
|
|
||||||
},
|
|
||||||
"preview-music_offtopic": {
|
|
||||||
color: "#a6634a",
|
|
||||||
opacity: "0.7"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class PreviewBar {
|
class PreviewBar {
|
||||||
container: HTMLUListElement;
|
container: HTMLUListElement;
|
||||||
@@ -132,8 +81,8 @@ class PreviewBar {
|
|||||||
tooltipTextWrapper.classList.remove("sbTooltipOneTitleThumbnailOffset");
|
tooltipTextWrapper.classList.remove("sbTooltipOneTitleThumbnailOffset");
|
||||||
} else if (category !== null) {
|
} else if (category !== null) {
|
||||||
categoryTooltip.classList.remove("sbHidden");
|
categoryTooltip.classList.remove("sbHidden");
|
||||||
categoryTooltip.textContent = chrome.i18n.getMessage("category_" + category)
|
categoryTooltip.textContent = utils.shortCategoryName(category)
|
||||||
|| (chrome.i18n.getMessage("preview") + " " + chrome.i18n.getMessage("category_" + category.split("preview-")[1]));
|
|| (chrome.i18n.getMessage("preview") + " " + utils.shortCategoryName(category.split("preview-")[1]));
|
||||||
|
|
||||||
// There is a title now
|
// There is a title now
|
||||||
tooltip.classList.remove("ytp-tooltip-text-no-title");
|
tooltip.classList.remove("ytp-tooltip-text-no-title");
|
||||||
@@ -208,8 +157,8 @@ class PreviewBar {
|
|||||||
let bar = this.createBar();
|
let bar = this.createBar();
|
||||||
bar.setAttribute('data-vs-segment-type', types[i]);
|
bar.setAttribute('data-vs-segment-type', types[i]);
|
||||||
|
|
||||||
bar.style.backgroundColor = barTypes[types[i]].color;
|
bar.style.backgroundColor = Config.config.barTypes[types[i]].color;
|
||||||
if (!this.onMobileYouTube) bar.style.opacity = barTypes[types[i]].opacity;
|
if (!this.onMobileYouTube) bar.style.opacity = Config.config.barTypes[types[i]].opacity;
|
||||||
bar.style.width = width + '%';
|
bar.style.width = width + '%';
|
||||||
bar.style.left = (timestamps[i][0] / duration * 100) + "%";
|
bar.style.left = (timestamps[i][0] / duration * 100) + "%";
|
||||||
bar.style.position = "absolute"
|
bar.style.position = "absolute"
|
||||||
|
|||||||
@@ -13,6 +13,13 @@ window.addEventListener('DOMContentLoaded', init);
|
|||||||
async function init() {
|
async function init() {
|
||||||
utils.localizeHtmlPage();
|
utils.localizeHtmlPage();
|
||||||
|
|
||||||
|
// Remove header if needed
|
||||||
|
if (window.location.hash === "#embed") {
|
||||||
|
for (const element of document.getElementsByClassName("titleBar")) {
|
||||||
|
element.classList.add("hidden");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!Config.configListeners.includes(optionsConfigUpdateListener)) {
|
if (!Config.configListeners.includes(optionsConfigUpdateListener)) {
|
||||||
Config.configListeners.push(optionsConfigUpdateListener);
|
Config.configListeners.push(optionsConfigUpdateListener);
|
||||||
}
|
}
|
||||||
@@ -230,7 +237,7 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) {
|
|||||||
|
|
||||||
let setButton = element.querySelector(".text-change-set");
|
let setButton = element.querySelector(".text-change-set");
|
||||||
setButton.addEventListener("click", async function(e) {
|
setButton.addEventListener("click", async function(e) {
|
||||||
if (textBox.value == "" || textBox.value.includes("/") || textBox.value.includes("http") || textBox.value.includes(":")) {
|
if (textBox.value == "" || textBox.value.includes("/") || textBox.value.includes("http")) {
|
||||||
alert(chrome.i18n.getMessage("addInvidiousInstanceError"));
|
alert(chrome.i18n.getMessage("addInvidiousInstanceError"));
|
||||||
} else {
|
} else {
|
||||||
// Add this
|
// Add this
|
||||||
@@ -291,19 +298,23 @@ function invidiousInit(checkbox: HTMLInputElement, option: string) {
|
|||||||
* @param checkbox
|
* @param checkbox
|
||||||
* @param option
|
* @param option
|
||||||
*/
|
*/
|
||||||
function invidiousOnClick(checkbox: HTMLInputElement, option: string) {
|
async function invidiousOnClick(checkbox: HTMLInputElement, option: string) {
|
||||||
if (checkbox.checked) {
|
return new Promise((resolve) => {
|
||||||
utils.setupExtraSitePermissions(function (granted) {
|
if (checkbox.checked) {
|
||||||
if (!granted) {
|
utils.setupExtraSitePermissions(function (granted) {
|
||||||
Config.config[option] = false;
|
if (!granted) {
|
||||||
checkbox.checked = false;
|
Config.config[option] = false;
|
||||||
} else {
|
checkbox.checked = false;
|
||||||
checkbox.checked = true;
|
} else {
|
||||||
}
|
checkbox.checked = true;
|
||||||
});
|
}
|
||||||
} else {
|
|
||||||
utils.removeExtraSiteRegistration();
|
resolve();
|
||||||
}
|
});
|
||||||
|
} else {
|
||||||
|
utils.removeExtraSiteRegistration();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -351,15 +362,6 @@ function keybindKeyPressed(element: HTMLElement, e: KeyboardEvent) {
|
|||||||
let button: HTMLElement = element.querySelector(".trigger-button");
|
let button: HTMLElement = element.querySelector(".trigger-button");
|
||||||
let option = element.getAttribute("sync-option");
|
let option = element.getAttribute("sync-option");
|
||||||
|
|
||||||
// Don't allow keys which are already listened for by youtube
|
|
||||||
let restrictedKeys = "1234567890,.jklftcibmJKLFTCIBMNP/<> -+";
|
|
||||||
if (restrictedKeys.indexOf(key) !== -1 ) {
|
|
||||||
closeKeybindOption(element, button);
|
|
||||||
|
|
||||||
alert(chrome.i18n.getMessage("theKey") + " " + key + " " + chrome.i18n.getMessage("keyAlreadyUsedByYouTube"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure keybind isn't used by the other listener
|
// Make sure keybind isn't used by the other listener
|
||||||
// TODO: If other keybindings are going to be added, we need a better way to find the other keys used.
|
// TODO: If other keybindings are going to be added, we need a better way to find the other keys used.
|
||||||
let otherKeybind = (option === "startSponsorKeybind") ? Config.config['submitKeybind'] : Config.config['startSponsorKeybind'];
|
let otherKeybind = (option === "startSponsorKeybind") ? Config.config['submitKeybind'] : Config.config['startSponsorKeybind'];
|
||||||
@@ -428,8 +430,8 @@ function activatePrivateTextChange(element: HTMLElement) {
|
|||||||
case "*":
|
case "*":
|
||||||
let jsonData = JSON.parse(JSON.stringify(Config.localConfig));
|
let jsonData = JSON.parse(JSON.stringify(Config.localConfig));
|
||||||
|
|
||||||
// Fix sponsorTimes data as it is destroyed from the JSON stringify
|
// Fix segmentTimes data as it is destroyed from the JSON stringify
|
||||||
jsonData.sponsorTimes = Config.encodeStoredItem(Config.localConfig.sponsorTimes);
|
jsonData.segmentTimes = Config.encodeStoredItem(Config.localConfig.segmentTimes);
|
||||||
|
|
||||||
result = JSON.stringify(jsonData);
|
result = JSON.stringify(jsonData);
|
||||||
break;
|
break;
|
||||||
@@ -438,7 +440,7 @@ function activatePrivateTextChange(element: HTMLElement) {
|
|||||||
textBox.value = result;
|
textBox.value = result;
|
||||||
|
|
||||||
let setButton = element.querySelector(".text-change-set");
|
let setButton = element.querySelector(".text-change-set");
|
||||||
setButton.addEventListener("click", () => {
|
setButton.addEventListener("click", async () => {
|
||||||
let confirmMessage = element.getAttribute("confirm-message");
|
let confirmMessage = element.getAttribute("confirm-message");
|
||||||
|
|
||||||
if (confirmMessage === null || confirm(chrome.i18n.getMessage(confirmMessage))) {
|
if (confirmMessage === null || confirm(chrome.i18n.getMessage(confirmMessage))) {
|
||||||
@@ -453,16 +455,15 @@ function activatePrivateTextChange(element: HTMLElement) {
|
|||||||
}
|
}
|
||||||
Config.convertJSON();
|
Config.convertJSON();
|
||||||
|
|
||||||
// Reload options on page
|
|
||||||
init();
|
|
||||||
|
|
||||||
if (newConfig.supportInvidious) {
|
if (newConfig.supportInvidious) {
|
||||||
let checkbox = <HTMLInputElement> document.querySelector("#support-invidious > label > label > input");
|
let checkbox = <HTMLInputElement> document.querySelector("#support-invidious > label > label > input");
|
||||||
|
|
||||||
checkbox.checked = true;
|
checkbox.checked = true;
|
||||||
invidiousOnClick(checkbox, "supportInvidious");
|
await invidiousOnClick(checkbox, "supportInvidious");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window.location.reload();
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
alert(chrome.i18n.getMessage("incorrectlyFormattedOptions"));
|
alert(chrome.i18n.getMessage("incorrectlyFormattedOptions"));
|
||||||
}
|
}
|
||||||
@@ -512,8 +513,8 @@ function copyDebugOutputToClipboard() {
|
|||||||
config: JSON.parse(JSON.stringify(Config.localConfig)) // Deep clone config object
|
config: JSON.parse(JSON.stringify(Config.localConfig)) // Deep clone config object
|
||||||
};
|
};
|
||||||
|
|
||||||
// Fix sponsorTimes data as it is destroyed from the JSON stringify
|
// Fix segmentTimes data as it is destroyed from the JSON stringify
|
||||||
output.config.sponsorTimes = Config.encodeStoredItem(Config.localConfig.sponsorTimes);
|
output.config.segmentTimes = Config.encodeStoredItem(Config.localConfig.segmentTimes);
|
||||||
|
|
||||||
// Sanitise sensitive user config values
|
// Sanitise sensitive user config values
|
||||||
delete output.config.userID;
|
delete output.config.userID;
|
||||||
|
|||||||
38
src/popup.ts
38
src/popup.ts
@@ -119,7 +119,7 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
let startTimeChosen = false;
|
let startTimeChosen = false;
|
||||||
|
|
||||||
//the start and end time pairs (2d)
|
//the start and end time pairs (2d)
|
||||||
let sponsorTimes = [];
|
let sponsorTimes: SponsorTime[] = [];
|
||||||
|
|
||||||
//current video ID of this tab
|
//current video ID of this tab
|
||||||
let currentVideoID = null;
|
let currentVideoID = null;
|
||||||
@@ -252,9 +252,9 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//load video times for this video
|
//load video times for this video
|
||||||
let sponsorTimesStorage = Config.config.sponsorTimes.get(currentVideoID);
|
let sponsorTimesStorage = Config.config.segmentTimes.get(currentVideoID);
|
||||||
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
|
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
|
||||||
if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) {
|
if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].segment.length < 2) {
|
||||||
startTimeChosen = true;
|
startTimeChosen = true;
|
||||||
PageElements.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd");
|
PageElements.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd");
|
||||||
}
|
}
|
||||||
@@ -336,13 +336,17 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0);
|
let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0);
|
||||||
|
|
||||||
if (sponsorTimes[sponsorTimesIndex] == undefined) {
|
if (sponsorTimes[sponsorTimesIndex] == undefined) {
|
||||||
sponsorTimes[sponsorTimesIndex] = [];
|
sponsorTimes[sponsorTimesIndex] = {
|
||||||
|
segment: [],
|
||||||
|
category: "sponsor",
|
||||||
|
UUID: null
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time;
|
sponsorTimes[sponsorTimesIndex].segment[startTimeChosen ? 1 : 0] = response.time;
|
||||||
|
|
||||||
let localStartTimeChosen = startTimeChosen;
|
let localStartTimeChosen = startTimeChosen;
|
||||||
Config.config.sponsorTimes.set(currentVideoID, sponsorTimes);
|
Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
|
||||||
|
|
||||||
//send a message to the client script
|
//send a message to the client script
|
||||||
if (localStartTimeChosen) {
|
if (localStartTimeChosen) {
|
||||||
@@ -528,7 +532,7 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function previewSponsorTime(index) {
|
function previewSponsorTime(index) {
|
||||||
let skipTime = sponsorTimes[index][0];
|
let skipTime = sponsorTimes[index].segment[0];
|
||||||
|
|
||||||
if (document.getElementById("startTimeMinutes" + index) != null) {
|
if (document.getElementById("startTimeMinutes" + index) != null) {
|
||||||
//edit is currently open, use that time
|
//edit is currently open, use that time
|
||||||
@@ -575,28 +579,28 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
startTimeMinutes.id = "startTimeMinutes" + index;
|
startTimeMinutes.id = "startTimeMinutes" + index;
|
||||||
startTimeMinutes.className = "sponsorTime popupElement";
|
startTimeMinutes.className = "sponsorTime popupElement";
|
||||||
startTimeMinutes.type = "text";
|
startTimeMinutes.type = "text";
|
||||||
startTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index][0]));
|
startTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index].segment[0]));
|
||||||
startTimeMinutes.style.width = "45px";
|
startTimeMinutes.style.width = "45px";
|
||||||
|
|
||||||
let startTimeSeconds = document.createElement("input");
|
let startTimeSeconds = document.createElement("input");
|
||||||
startTimeSeconds.id = "startTimeSeconds" + index;
|
startTimeSeconds.id = "startTimeSeconds" + index;
|
||||||
startTimeSeconds.className = "sponsorTime popupElement";
|
startTimeSeconds.className = "sponsorTime popupElement";
|
||||||
startTimeSeconds.type = "text";
|
startTimeSeconds.type = "text";
|
||||||
startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]);
|
startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index].segment[0]);
|
||||||
startTimeSeconds.style.width = "60px";
|
startTimeSeconds.style.width = "60px";
|
||||||
|
|
||||||
let endTimeMinutes = document.createElement("input");
|
let endTimeMinutes = document.createElement("input");
|
||||||
endTimeMinutes.id = "endTimeMinutes" + index;
|
endTimeMinutes.id = "endTimeMinutes" + index;
|
||||||
endTimeMinutes.className = "sponsorTime popupElement";
|
endTimeMinutes.className = "sponsorTime popupElement";
|
||||||
endTimeMinutes.type = "text";
|
endTimeMinutes.type = "text";
|
||||||
endTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index][1]));
|
endTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index].segment[1]));
|
||||||
endTimeMinutes.style.width = "45px";
|
endTimeMinutes.style.width = "45px";
|
||||||
|
|
||||||
let endTimeSeconds = document.createElement("input");
|
let endTimeSeconds = document.createElement("input");
|
||||||
endTimeSeconds.id = "endTimeSeconds" + index;
|
endTimeSeconds.id = "endTimeSeconds" + index;
|
||||||
endTimeSeconds.className = "sponsorTime popupElement";
|
endTimeSeconds.className = "sponsorTime popupElement";
|
||||||
endTimeSeconds.type = "text";
|
endTimeSeconds.type = "text";
|
||||||
endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]);
|
endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index].segment[1]);
|
||||||
endTimeSeconds.style.width = "60px";
|
endTimeSeconds.style.width = "60px";
|
||||||
|
|
||||||
//the button to set the current time
|
//the button to set the current time
|
||||||
@@ -668,11 +672,11 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function saveSponsorTimeEdit(index, closeEditMode = true) {
|
function saveSponsorTimeEdit(index, closeEditMode = true) {
|
||||||
sponsorTimes[index][0] = getSponsorTimeEditTimes("startTime", index);
|
sponsorTimes[index].segment[0] = getSponsorTimeEditTimes("startTime", index);
|
||||||
sponsorTimes[index][1] = getSponsorTimeEditTimes("endTime", index);
|
sponsorTimes[index].segment[1] = getSponsorTimeEditTimes("endTime", index);
|
||||||
|
|
||||||
//save this
|
//save this
|
||||||
Config.config.sponsorTimes.set(currentVideoID, sponsorTimes);
|
Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
|
||||||
|
|
||||||
messageHandler.query({
|
messageHandler.query({
|
||||||
active: true,
|
active: true,
|
||||||
@@ -692,7 +696,7 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
//deletes the sponsor time submitted at an index
|
//deletes the sponsor time submitted at an index
|
||||||
function deleteSponsorTime(index) {
|
function deleteSponsorTime(index) {
|
||||||
//if it is not a complete sponsor time
|
//if it is not a complete sponsor time
|
||||||
if (sponsorTimes[index].length < 2) {
|
if (sponsorTimes[index].segment.length < 2) {
|
||||||
messageHandler.query({
|
messageHandler.query({
|
||||||
active: true,
|
active: true,
|
||||||
currentWindow: true
|
currentWindow: true
|
||||||
@@ -710,7 +714,7 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
sponsorTimes.splice(index, 1);
|
sponsorTimes.splice(index, 1);
|
||||||
|
|
||||||
//save this
|
//save this
|
||||||
Config.config.sponsorTimes.set(currentVideoID, sponsorTimes);
|
Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
|
||||||
|
|
||||||
//if they are all removed
|
//if they are all removed
|
||||||
if (sponsorTimes.length == 0) {
|
if (sponsorTimes.length == 0) {
|
||||||
@@ -780,7 +784,7 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
//hides and shows the submit times button when needed
|
//hides and shows the submit times button when needed
|
||||||
function showSubmitTimesIfNecessary() {
|
function showSubmitTimesIfNecessary() {
|
||||||
//check if an end time has been specified for the latest sponsor time
|
//check if an end time has been specified for the latest sponsor time
|
||||||
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) {
|
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].segment.length > 1) {
|
||||||
//show submit times button
|
//show submit times button
|
||||||
document.getElementById("submitTimesContainer").style.display = "unset";
|
document.getElementById("submitTimesContainer").style.display = "unset";
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ class SkipNotice {
|
|||||||
|
|
||||||
noticeElement: HTMLDivElement;
|
noticeElement: HTMLDivElement;
|
||||||
|
|
||||||
|
skipNoticeRef: React.MutableRefObject<SkipNoticeComponent>;
|
||||||
|
|
||||||
constructor(segments: SponsorTime[], autoSkip: boolean = false, contentContainer) {
|
constructor(segments: SponsorTime[], autoSkip: boolean = false, contentContainer) {
|
||||||
this.segments = segments;
|
this.segments = segments;
|
||||||
this.autoSkip = autoSkip;
|
this.autoSkip = autoSkip;
|
||||||
@@ -51,6 +53,7 @@ class SkipNotice {
|
|||||||
<SkipNoticeComponent segments={segments}
|
<SkipNoticeComponent segments={segments}
|
||||||
autoSkip={autoSkip}
|
autoSkip={autoSkip}
|
||||||
contentContainer={contentContainer}
|
contentContainer={contentContainer}
|
||||||
|
ref={this.skipNoticeRef}
|
||||||
closeListener={() => this.close()} />,
|
closeListener={() => this.close()} />,
|
||||||
this.noticeElement
|
this.noticeElement
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -58,6 +58,11 @@ interface SponsorTime {
|
|||||||
hidden?: SponsorHideType;
|
hidden?: SponsorHideType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface PreviewBarOption {
|
||||||
|
color: string,
|
||||||
|
opacity: string
|
||||||
|
}
|
||||||
|
|
||||||
type VideoID = string;
|
type VideoID = string;
|
||||||
|
|
||||||
export {
|
export {
|
||||||
@@ -68,5 +73,6 @@ export {
|
|||||||
CategorySkipOption,
|
CategorySkipOption,
|
||||||
SponsorTime,
|
SponsorTime,
|
||||||
VideoID,
|
VideoID,
|
||||||
SponsorHideType
|
SponsorHideType,
|
||||||
|
PreviewBarOption
|
||||||
};
|
};
|
||||||
10
src/utils.ts
10
src/utils.ts
@@ -338,7 +338,7 @@ class Utils {
|
|||||||
secondsNum = Math.floor(secondsNum);
|
secondsNum = Math.floor(secondsNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
let secondsDisplay: string = String(secondsNum.toFixed(3));
|
let secondsDisplay: string = String(precise ? secondsNum.toFixed(3) : secondsNum);
|
||||||
|
|
||||||
if (secondsNum < 10) {
|
if (secondsNum < 10) {
|
||||||
//add a zero
|
//add a zero
|
||||||
@@ -350,6 +350,10 @@ class Utils {
|
|||||||
return formatted;
|
return formatted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shortCategoryName(categoryName: string): string {
|
||||||
|
return chrome.i18n.getMessage("category_" + categoryName + "_short") || chrome.i18n.getMessage("category_" + categoryName);
|
||||||
|
}
|
||||||
|
|
||||||
getRawSeconds(minutes: number, seconds: number): number {
|
getRawSeconds(minutes: number, seconds: number): number {
|
||||||
return minutes * 60 + seconds;
|
return minutes * 60 + seconds;
|
||||||
}
|
}
|
||||||
@@ -358,6 +362,10 @@ class Utils {
|
|||||||
return window.location.protocol === "http:" || window.location.protocol === "https:";
|
return window.location.protocol === "http:" || window.location.protocol === "https:";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isHex(num: string): boolean {
|
||||||
|
return Boolean(num.match(/^[0-9a-f]+$/i));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is this Firefox (web-extensions)
|
* Is this Firefox (web-extensions)
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user