mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-06 11:37:02 +03:00
Compare commits
54 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6879e90c16 | ||
|
|
8674e85df5 | ||
|
|
be6e12d531 | ||
|
|
32d3487b07 | ||
|
|
3ef2673bfc | ||
|
|
ac6cd2cec1 | ||
|
|
995ed929ca | ||
|
|
592af4e20f | ||
|
|
ecfcb0b846 | ||
|
|
18d10ada5e | ||
|
|
3a7b6b27c2 | ||
|
|
fea8f93b5a | ||
|
|
daa7a653c9 | ||
|
|
ddf3f7c6ff | ||
|
|
fbcff7f4c4 | ||
|
|
59f63f1b4b | ||
|
|
e432abe79d | ||
|
|
08a063b612 | ||
|
|
2d14176542 | ||
|
|
5fad4509f0 | ||
|
|
bd44c4721b | ||
|
|
606b2fbee3 | ||
|
|
f18aa19172 | ||
|
|
8337b54a44 | ||
|
|
257098fd96 | ||
|
|
0403393124 | ||
|
|
11144fa77b | ||
|
|
dc5ecaded4 | ||
|
|
60ae3111c2 | ||
|
|
9f0f306439 | ||
|
|
08c5c73f4a | ||
|
|
35fc238891 | ||
|
|
8b7436320f | ||
|
|
081e03e4ba | ||
|
|
bf84139ea7 | ||
|
|
7498c6cf1b | ||
|
|
abe3f0532a | ||
|
|
90c78af59f | ||
|
|
00045aa9d7 | ||
|
|
52f686977b | ||
|
|
fd05281c09 | ||
|
|
cc3e613396 | ||
|
|
a0bdcbaf11 | ||
|
|
6ca031d9e7 | ||
|
|
0b560f3fbc | ||
|
|
8dfa386cdb | ||
|
|
719010db97 | ||
|
|
928c075416 | ||
|
|
4469eada54 | ||
|
|
b630545702 | ||
|
|
1eb1574943 | ||
|
|
80d014bc29 | ||
|
|
cd52137454 | ||
|
|
3879cc6de3 |
1
.github/pull_request_template.md
vendored
Normal file
1
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1 @@
|
||||
- [ ] I agree to license my contribution under LGPL-3.0 **or** my contribution is from another project with a license compatible with LGPL-3.0
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -5,4 +5,5 @@ node_modules
|
||||
web-ext-artifacts
|
||||
.vscode/
|
||||
dist/
|
||||
tmp/
|
||||
tmp/
|
||||
.DS_Store
|
||||
1
CONTRIBUTING.md
Normal file
1
CONTRIBUTING.md
Normal file
@@ -0,0 +1 @@
|
||||
If you make any contributions to SponsorBlock after this file was created, you are agreeing that any code you have contributed will be licensed under LGPL-3.0.
|
||||
13
README.md
13
README.md
@@ -30,7 +30,7 @@
|
||||
<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=Chrome%20Users" alt="Badge"></img></a>
|
||||
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Submissions&query=totalSubmissions&suffix=%20segments&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=Active%20Users&query=apiUsers&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetTotalStats&color=darkblue" alt="Badge"></img></a>
|
||||
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Time%20Saved%20From%20Skips&query=daysSaved&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetDaysSavedFormatted&color=darkgreen&suffix=%20days" alt="Badge"></img></a>
|
||||
</p>
|
||||
|
||||
@@ -50,14 +50,10 @@ See the [Wiki](https://github.com/ajayyy/SponsorBlock/wiki) for important links.
|
||||
|
||||
The backend server code is available here: https://github.com/ajayyy/SponsorBlockServer
|
||||
|
||||
It is a simple SQLite database that will hold all the timing data.
|
||||
|
||||
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database.db ([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.
|
||||
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database ([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).
|
||||
|
||||
A [previous project](https://github.com/Sponsoff/sponsorship_remover) attempted to create a neural network to predict when sponsored segments happen. That project is sadly abandoned now, so I have decided to attempt to revive this idea starting from a crowd-sourced system instead.
|
||||
|
||||
# API
|
||||
|
||||
You can read the API docs [here](https://github.com/ajayyy/SponsorBlockServer#api-docs).
|
||||
@@ -79,7 +75,6 @@ The result is in `dist`. This can be loaded as an unpacked extension
|
||||
Run `npm run dev` to run the extension using a clean browser profile with hot reloading. Use `npm run dev:firefox` for Firefox. This uses [`web-ext run`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/#commands).
|
||||
Known chromium bug: Extension is not loaded properly on first start. Visit `chrome://extensions/` and reload the extension.
|
||||
|
||||
|
||||
### Attribution Generation
|
||||
|
||||
If you contribute and add a dependency, update the attribution file using the following steps:
|
||||
@@ -95,7 +90,7 @@ mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt
|
||||
|
||||
The awesome [Invidious API](https://github.com/omarroth/invidious/wiki/API) was previously used.
|
||||
|
||||
Originally forked from [YTSponsorSkip](https://github.com/NDevTK/YTSponsorSkip), but zero code remains.
|
||||
Originally forked from [YTSponsorSkip](https://github.com/NDevTK/YTSponsorSkip), but very little code remains.
|
||||
|
||||
Icons made by:
|
||||
* <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="https://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a>
|
||||
@@ -105,4 +100,4 @@ Icons made by:
|
||||
|
||||
### License
|
||||
|
||||
This project is licensed under GNU GPL v3
|
||||
This project is licensed under GNU GPL v3 or any later version
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "SponsorBlock",
|
||||
"version": "2.0.13.1",
|
||||
"version": "2.0.15.1",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"content_scripts": [{
|
||||
|
||||
44
package-lock.json
generated
44
package-lock.json
generated
@@ -4554,6 +4554,15 @@
|
||||
"requires": {
|
||||
"glob": "^7.1.3"
|
||||
}
|
||||
},
|
||||
"ssri": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
|
||||
"integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"figgy-pudding": "^3.5.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5488,15 +5497,6 @@
|
||||
"randombytes": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"ssri": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
|
||||
"integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minipass": "^3.1.1"
|
||||
}
|
||||
},
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
@@ -7984,9 +7984,9 @@
|
||||
}
|
||||
},
|
||||
"hosted-git-info": {
|
||||
"version": "2.8.5",
|
||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
|
||||
"integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg=="
|
||||
"version": "2.8.9",
|
||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
|
||||
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
|
||||
},
|
||||
"html-encoding-sniffer": {
|
||||
"version": "2.0.1",
|
||||
@@ -11692,9 +11692,9 @@
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.19",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
|
||||
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
|
||||
"version": "4.17.21",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
|
||||
},
|
||||
"lodash.defaults": {
|
||||
"version": "4.2.0",
|
||||
@@ -14497,12 +14497,12 @@
|
||||
}
|
||||
},
|
||||
"ssri": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
|
||||
"integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
|
||||
"integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"figgy-pudding": "^3.5.1"
|
||||
"minipass": "^3.1.1"
|
||||
}
|
||||
},
|
||||
"stack-utils": {
|
||||
@@ -16734,9 +16734,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"y18n": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
|
||||
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
|
||||
"integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.1.1",
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
{}
|
||||
{
|
||||
"Username": {
|
||||
"message": "መለያ ስም"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,61 @@
|
||||
{}
|
||||
{
|
||||
"fullName": {
|
||||
"message": "سبونسر بلوك لليوتيوب - تخطي الرعاية الاعلانية",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "تخطي الرعاية الاعلانية ، التسول في الاشتراك والمزيد على مقاطع الفيديو على اليوتيوب. التبليغ عن الرعايه الاعلانيه علي مقاطع الفيديو التي تشاهدها لتوفير وقتك و وقت الآخرين.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "الخادم قال أن هذا الطلب خاطيء"
|
||||
},
|
||||
"429": {
|
||||
"message": "لقد قدمت الكثير من اوقات الرعاية الاعلانية لهذا الفيديو الواحد، هل أنت متأكد من وجود هذا العدد؟"
|
||||
},
|
||||
"409": {
|
||||
"message": "تم تقديم هذا بالفعل من قبل"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "القناة في القائمة البيضاء!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "جزء"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "أجزاء"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "التصويت على هذا الإرسال"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "إبلاغ"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "الإبلاغ عن هذا التقديم كغير صحيح."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "إلغاء"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "جاري التحميل..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "لا تظهر أبداً"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "قم الضغط علي تخطي للوصول إلى المكان الذي أتيت منه."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "الرجوع في التخطي"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "اعاده التخطي"
|
||||
},
|
||||
"paused": {
|
||||
"message": "ايقاف مؤقت"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "تم إيقاف الموقت"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,9 @@
|
||||
{}
|
||||
{
|
||||
"fullName": {
|
||||
"message": "ইউটিউবের জন্য স্পনসরব্লক - স্পনসরশিপ এড়িয়ে যান",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"409": {
|
||||
"message": "এটি আগেই জমা দেওয়া হয়েছে"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segment nyní končí"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Zrušit vytváření segmentu"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nebylo nalezeno žádné YouTube video.\nPokud je to špatně, obnovte záložku."
|
||||
},
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Jste si jisti, že toto chcete obnovit?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Toto video bylo zjištěno jako neuvedené. Klikněte na Zrušit, pokud nechcete kontrolovat pro přeskočitelné segmenty."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignorovat neuvedená / soukromá videa"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Toto nastavení mírně zpomalí SponsorBlock. Přeskakování vyhledávání segmentů vyžaduje posílání ID videa serveru. Pokud vám vadí odesílání neuvedených videí přes internet, povolte tuto možnost."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com je nyní podporováno"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID kanálu ještě nebylo načteno."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Zdá se, že něco blokuje schopnost rozšíření SponsorBlock získat data o videu. Bude to nejspíš váš adblocker. Podívejte se prosím na https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Vypadá to, že něco blokuje schopnost SponsorBlocku získat údaje o videu. Pro více informací prosím navštivte https://github.com/ajayyy/SponsorBlock/issues/741."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Pokud vám tento problém nepůjde vyřešit, vypněte nastavení 'Ignore unlisted/private videos', protože SponsorBlock nemůže zjistit, jestli je vaše video veřejné či nikoliv"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Vypadá to, že se SponsorBlock nemůže připojit k YouTube API. Pro opravení tohoto problému přijměte žádost o oprávnění, která se dále objeví, a poté znovu načtěte stránku."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Přijmout oprávnění"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Žádost o oprávnění byla úspěšná!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Žádost o oprávnění se nezdařila, neklikli jste na Odmítnout?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Pokud vám tento problém nepůjde vyřešit, vypněte nastavení 'Vynutit kontrolu kanálu před přeskočením', protože SponsorBlock nemůže zjistit informace o kanálu"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Pokud k tomu stále dochází, může to být způsobeno vaším adblockerem. Podívejte se prosím https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Bist du dir sicher, dass du das zurücksetzen möchtest?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Das Video wurde als \"nicht gelistet\" erkannt. Klicke auf \"Abbrechen\", wenn du nicht nach Segmenten suchen möchtest."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Nicht gelistete und private Videos ignorieren"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Diese Einstellung wird SponsorBlock leicht verlangsamen. Das Abfragen von überspringbaren Videosegmenten erfordert das Senden der Video-ID an den Server. Wenn du dir Sorgen darüber machst, dass IDs von nicht gelisteten Videos über das Internet gesendet werden, aktiviere diese Option."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "https://m.youtube.com wird jetzt unterstützt"
|
||||
},
|
||||
@@ -591,23 +582,32 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanal-ID wurde noch nicht geladen."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Irgendwas hält SponsorBlock davon ab, die Videodaten abzurufen. Eine mögliche Ursache sind Werbeblocker. Mehr Infos: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Es scheint, dass SponsorBlock nicht in der Lage ist, die YouTube-API zu erreichen. Um dies zu beheben, akzeptieren Sie die Berechtigungsanfrage, die gleich erscheint; Warten Sie ein paar Sekunden, und laden Sie die Seite neu."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Wenn Sie dies nicht lösen können, deaktivieren Sie die Einstellung 'Nicht gelistete und private Videos ignorieren', da SponsorBlock nicht in der Lage ist, die Sichtbarkeit für dieses Video abzurufen"
|
||||
"acceptPermission": {
|
||||
"message": "Berechtigung akzeptieren"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Die Berechtigungsanfrage war erfolgreich!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Berechtigungsanfrage fehlgeschlagen, haben Sie \"Ablehnen\" angeklickt?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Wenn Sie dies nicht lösen können, deaktivieren Sie die Einstellung 'Kanalprüfung vor dem Überspringen von Segmenten erzwingen', da SponsorBlock nicht in der Lage ist, die Sichtbarkeit für dieses Video abzurufen."
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Falls dies weiterhin geschieht, könnte dies durch einen Werbeblocker verursacht werden. Mehr Infos: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Erzwingen, dass vor dem Überspringen von Segmenten überprüft wird, ob der Kanal zur Whitelist hinzugefügt wurde"
|
||||
"message": "Kanalprüfung vor dem Überspringen von Segmenten erzwingen"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Standardmäßig werden Segmente schon übersprungen, bevor SponsorBlock die Kanal-ID einliest. Das kann dazu führen, dass Segmente am Anfang von Videos eines Kanals übersprungen werden, der zur Whitelist hinzugefügt wurde. Diese Option zwingt SponsorBlock dazu, auf die Kanal-ID zu warten - dies resultiert in einer kleinen Verzögerung, die aber mit einer schnellen Internetverbindung nicht spürbar sein sollte."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Eventuell solltest du die Option \"Erzwingen, dass vor dem Überspringen von Segmenten überprüft wird, ob der Kanal zur Whitelist hinzugefügt wurde\" aktivieren."
|
||||
"message": "Eventuell solltest du die Option \"Kanalprüfung vor dem Überspringen von Segmenten erzwingen\" aktivieren."
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Nicht korrekt oder falsches Timing"
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segment Ends Now"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Cancel Creating Segment"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "No YouTube video found.\nIf this is incorrect, refresh the tab."
|
||||
},
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Are you sure you would like to reset this?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "The video has been detected as unlisted. Click cancel if you do not want to check for skip segments."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignore Unlisted/Private Videos"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "This setting will slightly slow down SponsorBlock. Skip segment lookups require sending the video ID to the server. If you are concerned about unlisted video IDs being sent over the internet, enable this option."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com is now supported"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Channel ID not loaded yet."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "It seems that something is blocking SponsorBlock's ability to get video data. This is probably your ad blocker. Please check https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "It seems that something is blocking SponsorBlock's ability to get video data. Please see https://github.com/ajayyy/SponsorBlock/issues/741 for more info."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "If you are unable to resolve this, then disable the setting 'Ignore unlisted/private videos', as SponsorBlock is unable to retrieve the visibility information for this video"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "It seems that SponsorBlock is unable to reach the YouTube API. To fix this, accept the permission prompt that will appear next, wait a few seconds, and then reload the page."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Accept permission"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Permission request succeeded!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Permission request failed, did you click deny?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "If you are unable to resolve this, then disable the setting 'Force Channel Check Before Skipping', as SponsorBlock is unable to retrieve the channel information for this video"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "If this keeps occuring, it could be caused by your ad blocker. Please check https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "El segmento termina ahora"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Cancelar Creación de Segmento"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "No se encontró vídeo de YouTube.\nSi esto es incorrecto, actualice la pestaña."
|
||||
},
|
||||
@@ -233,7 +236,7 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Establecer clave para omitir un segmento"
|
||||
"message": "Establecer tecla para omitir un segmento"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Establecer tecla para iniciar segmento"
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "¿Estás seguro de que te gustaría reiniciar esto?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "El vídeo ha sido detectado como no listado. Haz clic en cancelar si no quieres comprobar si hay segmentos salteados."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignorar los vídeos no listados/privados"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Esta configuración ralentizará ligeramente a SponsorBlock. Las búsquedas de segmentos de salto requieren el envío de la identificación del vídeo al servidor. Si le preocupa que se envíen por Internet identificadores de vídeo no listados, habilite esta opción."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com ahora es compatible"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID de canal no cargado todavía."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Parece que algo está bloqueando la capacidad de SponsorBlock para obtener datos de vídeo. Este es probablemente su bloqueador de anuncios. Por favor, compruebe https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Parece que algo está bloqueando la capacidad de SponsorBlock para obtener datos de video, Por favor, vea https://github.com/ajayyy/SponsorBlock/issues/741 para más información."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Si no puedes resolver esto, desactiva la configuración 'Ignorar vídeos no listados/privados', porque SponsorBlock no puede recuperar la información de visibilidad de este vídeo"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Parece que SponsorBlock no puede acceder a la API de YouTube. Para solucionarlo, acepte el aviso de permiso que aparecerá a continuación, espera unos segundos y vuelve a cargar la página."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Aceptar permiso"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "¡Petición de permiso realizada con éxito!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "La petición de permiso ha fallado, ¿ha hecho clic en denegar?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Si no puede resolverlo, desactive la opción \"Forzar Comprobación de Canal antes de Saltar\", ya que SponsorBlock no puede recuperar la información del canal de este video"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Si esto sigue ocurriendo, podría ser causado por tu bloqueador de anuncios. Por favor, compruebe https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Solicitudes"
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segment lõpeb nüüd"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Tühista segmendi loomine"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "YouTube'i videot ei leitud.\nKui see ei vasta tõele, laadi kaart uuesti."
|
||||
},
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Kas soovid kindlasti selle lähtestada?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "See video on registrivälisena tuvastatud. Klõpsa \"tühista\", kui ei soovi otsida vahelejätmise segmente."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignoreeri registriväliseid/privaatsed videoid"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "See valik aeglustab veidi SponsorBlocki. Vahelejätmise segmentide hankimiseks saadetakse video ID serverisse. Kui oled mures registriväliste videote IDde internetti saatmise üle, luba see valik."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com on nüüd toetatud"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanali ID pole veel laaditud."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Tundub, et miski segab SponsorBlocki video andmete hankimise võimalust. See on ilmselt sinu reklaamiblokeerija. Palun vaata https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Tundub, et miski segab SponsorBlocki video andmete hankimise võimalust. Rohkema abi saamiseks palun vaata: https://github.com/ajayyy/SponsorBlock/issues/741"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Kui sa ei suuda seda lahendada, keela valik \"ignoreeri registriväliseid/privaatsed videoid\", kuna SponsorBlock ei leia selle video nähtavusteavet"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Tundub, et SponsorBlock ei pääse YouTube'i rakendusliidesele ligi. Selle parandamiseks nõustu järgnevalt kuvatava loataotlusega, oota paar sekundit ning seejärel laadi leht uuesti."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Nõustu loaga"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Loataotlus õnnestus!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Loataotlus ebaõnnestus, kas sa keeldusid?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Kui sa ei suuda seda lahendada, keela valik \"sunnitud kanalikontroll enne vahelejätmist\", kuna SponsorBlock ei leia selle video kanaliteavet"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Kui see jätkub, võib see olla põhjustatud sinu reklaamiblokeerijast. Palun vaata https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
"message": "Ladataan..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Älä näytä koskaan"
|
||||
"message": "Älä Näytä Koskaan"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Paina 'älä ohita' mennäksesi takaisin kohtaan jossa olit."
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segmentti Päättyy Nyt"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Peruuta Segmentin Luominen"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "YouTube-videota ei löytynyt.\nJos tämä on väärässä, päivitä välilehti."
|
||||
},
|
||||
@@ -104,7 +107,7 @@
|
||||
"message": "Avaa SponsorBlock-ponnahdusikkuna"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "Sulje Ponnahdus-ikkuna"
|
||||
"message": "Sulje Ponnahdusikkuna"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Lähetä Segmentit"
|
||||
@@ -165,7 +168,7 @@
|
||||
"message": "Asetukset"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Näytä painikkeet YouTuben soittimessa"
|
||||
"message": "Näytä Painikkeet YouTuben Soittimessa"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Piilota painikkeet YouTuben soittimessa"
|
||||
@@ -174,7 +177,7 @@
|
||||
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Näytä info-painike YouTuben soittimessa"
|
||||
"message": "Näytä Info-Painike YouTuben Soittimessa"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Piilota info-painike YouTuben soittimessa"
|
||||
@@ -186,7 +189,7 @@
|
||||
"message": "Piilota poista-painike YouTuben soittimessa"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Näytä poista-painike YouTuben soittimessa"
|
||||
"message": "Näytä Poista-Painike YouTuben Soittimessa"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Tämä on YouTuben soittimen painike, joka poistaa kaikki kyseisen videon sponsorointikohdat, joita et ole vielä lähettänyt."
|
||||
@@ -229,7 +232,7 @@
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Jos et vieläkään pidä siitä, paina \"älä koskaan näytä\" -painiketta.",
|
||||
"message": "Jos et vieläkään pidä siitä, paina \"älä näytä koskaan\" -painiketta.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Oletko varma, että haluat nollata tämän?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Video on havaittu piilotetuksi. Paina peruuta jos et halua tarkistaa ohitettavia segmenttejä."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ohita Piilotetut/Yksityiset Videot"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Tämä asetus hidastaa SponsorBlockia hieman. Ohitus-segmenttien haku edellyttää video ID:n lähettämistä palvelimelle. Jos olet huolissasi, että piilotettujen videoiden ID:itä lähetetään internetin kautta, ota tämä asetus käyttöön."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com-osoitetta tuetaan nyt"
|
||||
},
|
||||
@@ -511,10 +505,10 @@
|
||||
"message": "Maksamaton/Itsensä Mainostus"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Samankaltainen \"sponsorin\" kanssa paitsi maksamaton tai itsensä mainostus. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä."
|
||||
"message": "Samankaltainen \"sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musiikki: muussa kuin Musiikki-osiossa"
|
||||
"message": "Musiikki: Ei-Musiikki-Osio"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Vain käytettävissä musiikkivideoissa. Tätä tulee käyttää vain musiikkivideoiden osissa, jotka eivät jo kuulu toiseen kategoriaan."
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanavatunnusta ei ole vielä ladattu."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Näyttää siltä, että jokin estää SponsorBlockin kykyä saada videotietoja. Tämä on luultavasti mainosten esto-ohjelmasi. Tarkista https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Näyttää siltä, että jokin estää SponsorBlockin kykyä saada videotietoja. Katso https://github.com/ajayyy/SponsorBlock/issues/741 lisätietoja varten."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Jos et pysty ratkaisemaan tätä, poista käytöstä asetus 'Ohita piilotetut/yksityiset videot', koska SponsorBlock ei pysty noutamaan tämän videon näkyvyystietoja"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Näyttää siltä, että SponsorBlock ei pysty saavuttamaan YouTube-APIa. Korjataksesi tämän, hyväksy seuraavaksi ilmestyvä käyttöoikeusilmoitus, odota muutama sekunti ja lataa sitten sivu uudelleen."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Hyväksy käyttöoikeus"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Käyttöoikeuspyyntö onnistui!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Käyttöoikeuspyyntö epäonnistui, klikkasitko kiellä?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Jos et pysty ratkaisemaan tätä, poista käytöstä asetus 'Pakota Kanavan Tarkistus Ennen Ohittamista', koska SponsorBlock ei pysty noutamaan tämän videon kanavatietoja"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Jos tämä toistuu, mainosten esto-ohjelmasi voi olla syynä. Katso https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Astuce: Vous pouvez configurer des raccourcis clavier dans les options"
|
||||
"message": "Astuce : vous pouvez configurer des raccourcis clavier dans les options"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Supprimer les temps"
|
||||
@@ -291,7 +291,7 @@
|
||||
"message": "Afficher le temps avec les passages supprimés"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "Ce temps apparaît entre crochets à côté du temps actuel sous la barre de défilement. Cela indique la durée totale de la vidéo après déduction de tout les segments. Ceci comprend les segments marqués comme étant uniquement à \"Afficher dans la barre de recherche\"."
|
||||
"message": "Ce temps apparaît entre crochets à côté du temps actuel sous la barre de défilement. Cela indique la durée totale de la vidéo après déduction de tous les segments. Ceci comprend les segments marqués comme étant uniquement à \"Afficher dans la barre de recherche\"."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Vous avez passé "
|
||||
@@ -324,7 +324,7 @@
|
||||
"message": "Importer/Exporter Votre ID d'Utilisateur"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Gardez ça privé. C'est comme un mot de passe et ne devrait pas être partagé avec quiconque. Si quelqu'un l'obtiens, il peut vous usurper."
|
||||
"message": "Cette information doit rester confidentielle. C'est comme un mot de passe et ne devrait pas être partagé avec quiconque. Si quelqu'un l'obtient, il pourra se faire passer pour vous."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Définir \"UserID\""
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Voulez-vous vraiment remettre à zéro ?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "La vidéo a été détectée comme étant non répertoriée. Cliquez sur annuler si vous ne voulez pas vérifier les segments sautés."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignorer les vidéos non listées"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Ce réglage ralentira légèrement SponsorBlock. Pour sauter des segments, il faut envoyer l'ID de la vidéo au serveur. Si vous craignez que des identifiants de vidéo non répertoriés soient envoyés sur Internet, activez cette option."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com est maintenant pris en charge"
|
||||
},
|
||||
@@ -514,7 +505,10 @@
|
||||
"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": {
|
||||
"message": "Musique : Segment non-musical"
|
||||
"message": "Musique : Segment non musical"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "A utiliser seulement pour les vidéos de musiques. Ceci ne devrait qu'être utilisé que pour des morceaux de vidéos de musiques qui ne sont pas couvert par d'autres catégories."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Hors musique"
|
||||
@@ -588,9 +582,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "L'ID de la chaîne n'a pas encore été chargé."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Il semble que quelque chose empêche SponsorBlock de récupérer les données de la vidéo. C'est probablement votre bloqueur de publicités. Veuillez consulter https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Si ça se reproduit, c'est peut-être causé par votre bloqueur de publicités. Veuillez consulter https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
|
||||
@@ -47,10 +47,10 @@
|
||||
"message": "Klikni unskip kako bi se vratio otkuda si došao."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Unskip"
|
||||
"message": "Ne preskači"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Reskip"
|
||||
"message": "Preskoči opet"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pauzirano"
|
||||
@@ -109,12 +109,23 @@
|
||||
"voteOnTime": {
|
||||
"message": "Glasaj za isječak"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Pošalji"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "Uređivanje dijela prikazat će se nakon što pritisneš gumb za slanje",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Očisti vremena"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Unesi vremena"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Tvoja slanja",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Ovo bi trebalo ostati privatno. slično je lozinki i ne bi se smjelo dijeliti ni s kime. Ako netko ovo ima, mogu se lažno predstavljati kao ti."
|
||||
},
|
||||
@@ -171,5 +182,75 @@
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Isječci kraći od postavljene vrijednosti neće biti preskočeni ili prikazani u playeru."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Pošalji segment"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Pošalji"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponzor"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Stanka/Uvodna animacija"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Interval bez stvarnog sadržaja. Može biti stanka, statični kadar, ponavljajuća animacija. Ovo se ne bi trebalo koristiti za prijelaze koji sadrže informacije."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Stanka"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Završni kadrovi/Zasluge"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Podsjetnik interakcije (Pretplati se)"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Podsjetnik interakcije"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Neplaćena promocija ili samopromocija"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Slično kao „sponzor”, osim za neplaćenu promociju i samopromociju. To uključuje odlomke marketinga, donacija ili informacija o tome, s kim su surađivali."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Glazba: Ne-glazbeni dio"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Samo za videospotove. Ovo bi se trebalo koristiti samo za dijelove videospotova koji još nisu obuhvaćeni drugom kategorijom."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Ne-glazbeni"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Ručno preskakanje"
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Moraš odabrati kategoriju za sve segmente koje šalješ!"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Ovaj je video kategoriziran kao glazba. Je li stvarno ima sponzora? Ako je ovo zapravo „Ne-glazbeni segment”, otvori opcije proširenja i aktiviraj ovu kategoriju. Zatim ovaj segment možeš posalti kao „Ne-glazbeni” umjesto sponzora. Pročitaj smjernice ako nešto nije jasno."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Više segmenata"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Smjernice"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Pročitaj Smjernice!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Stigle su kategorije!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Otvori opcije za preskakanje uvoda, kraja, proizvoda itd."
|
||||
},
|
||||
"help": {
|
||||
"message": "Pomoć"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -295,6 +295,9 @@
|
||||
"hoursLower": {
|
||||
"message": "óra"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " az életükből"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "A szerver állapotához tekintse meg a status.sponsor.ajay.app oldalt."
|
||||
},
|
||||
@@ -385,15 +388,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Biztosan vissza szeretné állítani?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Videó észlelve nem listázottként. Kattintson a Mégse gombra, ha nem akar ellenőrizni átugorható szegmensek után."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Nem listázott/Privát videók ignorálása"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Ez a beállítás kissé lelassíthatja a SponsorBlockot. A szegmensek átugrásához szükséges, hogy a videoID el legyen küldve a szerverre. Ha aggódik az interneten küldött nem listázott videóazonosítók küldése miatt, kapcsolja be ezt a funkciót."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "az m.youtube.com már támogatott"
|
||||
},
|
||||
@@ -558,9 +552,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "A csatorna azonosító még nem töltődött be."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Valami meggátolja a SponsorBlockot a videó adatainak megszerzésében. Valószínűleg az ad-blockere. Kérem ellenőrizze: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Ha ez folyamatosan előfordul, lehet hogy az ad-blockere okozza. Kérem nézzen utána: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
|
||||
@@ -79,8 +79,11 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segmen Berakhir Sekarang"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Batalkan Membuat Segmen"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Video YouTube tidak ditemukan.\nJika hal ini salah, refresh tab."
|
||||
"message": "Video YouTube tidak ditemukan.\nJika terjadi kesalahan, segarkan halaman."
|
||||
},
|
||||
"success": {
|
||||
"message": "Sukses!"
|
||||
@@ -207,7 +210,7 @@
|
||||
"message": "Fetch Ulang Segmen Di Video Baru"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Jika ini merupakan video baru, dan tidak ada segmen yang ditemukan, itu akan terus merefetch setiap beberapa menit saat anda menonton."
|
||||
"message": "Jika ini merupakan video baru, dan tidak ada segmen yang ditemukan, SponsorBlock akan terus merefetch setiap beberapa menit saat anda menonton."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Tampilkan Pemberitahuan Lagi"
|
||||
@@ -294,7 +297,7 @@
|
||||
"message": "Waktu ini muncul di dalam kurung disamping waktu asli di bilah waktu. Ini menunjukkan durasi total video yang tidak termasuk segmen apapun. Ini termasuk segmen yang ditandai hanya \"Tampilkan Di Bilah Waktu\"."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Anda telah melewatkan "
|
||||
"message": "Anda sudah melewati "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Anda sudah menghemat waktu "
|
||||
@@ -312,10 +315,10 @@
|
||||
"message": "jam"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Anda telah menyelamatkan orang"
|
||||
"message": "Anda sudah menghemat waktu orang lain"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " dalam hidup mereka"
|
||||
"message": " dari hidup mereka"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Cek status.sponsor.ajay.app untuk status server."
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Apakah anda yakin ingin mengatur ulang ini?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Video ini dideteksi sebagai tidak terdaftar. Klik batal jika kamu tidak ingin mengecek untuk melewati segmen."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Abaikan Video Tidak Terdaftar/Privat"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Pengaturan ini akan sedikit melambatkan SponsorBlock. Pencarian lewati segmen membutuhkan pengiriman ID video ke server. Jika anda khawatir tentang ID unlisted video terkirim ke internet, hidupkan opsi ini."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com sekarang didukung"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID Channel belum dimuat."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Sepertinya ada sesuatu yang memblokir kemampuan SponsorBlock untuk mendapatkan data video. Kemungkinan karena ad blocker anda. Mohon cek https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Sepertinya sesuatu memnghalangi abilitas SponsorBlock untuk mendapatkan data video. Silahkan lihat https://github.com/ajayyy/SponsorBlock/issues/741 untuk info lebih lanjut."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Jika anda tidak bisa menyelesaikan ini, maka nonaktifkan pengaturan 'Abaikan video tidak terdaftar/privat', karena SponsorBlock tidak bisa mendapatkan informasi visibilitas untuk video ini"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Sepertinya SponsorBlock tidak dapat menjangkau API YouTube. Untuk menyelesaikan masalah ini, terima permintaan izin yang akan muncul selanjutnya, tunggu beberapa detik, dan muat ulang halaman ini."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Terima permintaan izin"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Permintaan izin berhasil!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Permintaan izin gagal, apakah anda mengklik tolak?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Apabila anda tidak dapat menyelesaikan masalah ini, maka nonaktifkan pengaturan 'Paksa Cek Channel Sebelum Melewati', dikarenakan SponsorBlock tidak dapat menerima informasi channel untuk video ini"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Jika ini terus terjadi, kemungkinan terjadi karena ad blocker anda. Mohon cek https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -79,8 +79,11 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Il Segmento Termina Ora"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Annulla Creazione del Segmento"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nessun video YouTube trovato.\nSe questo non è corretto, ricarica la scheda."
|
||||
"message": "Nessun video YouTube trovato.\nSe è un errore, ricarica la scheda."
|
||||
},
|
||||
"success": {
|
||||
"message": "Successo!"
|
||||
@@ -112,14 +115,20 @@
|
||||
"submitCheck": {
|
||||
"message": "Sei sicuro di volerlo inviare?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Aggiungi il canale alle eccezioni"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Rimuovi il canale dalle eccezioni"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Vota un Segmento"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Iscrizioni"
|
||||
"message": "Contributi"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Hai salvato le persone da "
|
||||
"message": "Hai fatto risparmiare in totale "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Classifica"
|
||||
@@ -128,11 +137,11 @@
|
||||
"message": "Invia"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "La modifica della sezione comparirà dopo aver cliccato Iscriviti",
|
||||
"message": "La modifica della sezione comparirà dopo che hai cliccato su Inviare",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Suggerimento: Puoi configurare combinazioni di tasti per l'inserimento nelle opzioni"
|
||||
"message": "Suggerimento: Puoi configurare dei comandi rapidi per l'inserimento nelle opzioni"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Cancella Minutaggi"
|
||||
@@ -144,7 +153,7 @@
|
||||
"message": "Viene utilizzato nelle pagine delle statistiche pubbliche che mostrano quanto hai contribuito. Vedi"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Nome Utente"
|
||||
"message": "Nome utente"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Imposta Username"
|
||||
@@ -226,6 +235,9 @@
|
||||
"message": "Se non ti piace ancora, premi il pulsante \"non mostrare mai\".",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Imposta un tasto per saltare un segmento"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Imposta chiave di associazione per l'inizio del segmento"
|
||||
},
|
||||
@@ -242,10 +254,10 @@
|
||||
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Salta abilitato"
|
||||
"message": "Saltare è abilitato"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "Salta disabilitato"
|
||||
"message": "Saltare è disabilitato"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Il Tuo Lavoro",
|
||||
@@ -303,7 +315,7 @@
|
||||
"message": "ore"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Hai salvato le persone"
|
||||
"message": "Hai salvato alle persone"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " delle loro vite"
|
||||
@@ -398,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Sei sicuro di voler eseguire il reset?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Il video è stato rilevato come non in elenco. Clicca su Annulla se non desideri verificare la presenza di segmenti da saltare."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignora Video Non Pubblicati/Privati"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Questa impostazione rallenterà leggermente SponsorBlock. Le ricerche di segmenti da saltare richiedono l'invio dell'ID video al server. Se sei preoccupato per gli ID video non in elenco inviati su Internet, attiva questa opzione."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com è ora supportato"
|
||||
},
|
||||
@@ -507,6 +510,9 @@
|
||||
"category_music_offtopic": {
|
||||
"message": "Musica: Sezione Non-Musicale"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Solo per video musicali. Dovrebbe essere usata solo per sezioni di video musicali non già comprese in un'altra categoria."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Musicale"
|
||||
},
|
||||
@@ -560,6 +566,10 @@
|
||||
"chooseACategory": {
|
||||
"message": "Scegli una Categoria"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "Per inviare segmenti della categoria \"{0}\", è necessario abilitarlo nelle opzioni. Sarai reindirizzato alle opzioni.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Devi selezionare una categoria per tutti i segmenti che stai inviando!"
|
||||
},
|
||||
@@ -575,8 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID canale non ancora caricato."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Sembra che qualcosa stia bloccando la capacità di SponsorBlock di ottenere dati video. Questo probabilmente è il tuo ad blocker. Controlla https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Sembra che qualcosa stia bloccando l'abilità di SponsorBlock di ottenere i dati del video. Sei pregato di vedere https://github.com/ajayyy/SponsorBlock/issues/741 per ulteriori informazioni."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Sembra che SponsorBlock non sia in grado di raggiungere l'API di YouTube. Per risolverlo, accetta la richiesta di autorizzazione che comparirà in seguito, attendi qualche secondo, quindi ricarica la pagina."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Accetta autorizzazione"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Richiesta di autorizzazione riuscita!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Richiesta di assicurazione fallita, hai cliccato nega?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Se non riesci a risolverlo, disabilita allora l'impostazione 'Forza Controllo Canale Prima di Saltare', poiché SponsorBlock non è in grado di recuperare le informazioni del canale per questo video"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Se questo continua a verificarsi, potrebbe essere causato dal tuo ad-blocker. Controlla https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -3,18 +3,37 @@
|
||||
"message": "SponserBlock for YouTube - 動画のスポンサーセクションを自動でスキップする",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "YouTube動画の提供表示や登録要求をスキップします。視聴している動画の当該部分を報告して,みんなが時間を節約できるようにしましょう。",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "サーバーがこのリクエストは無効であると返答しました"
|
||||
},
|
||||
"429": {
|
||||
"message": "一つの動画に対してあまりに多くのセグメントを提出しています。本当にこれだけ必要ですか?"
|
||||
},
|
||||
"409": {
|
||||
"message": "これは既に提出されています。"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "チャンネルをホワイトリストに登録しました!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "セグメント"
|
||||
"message": "区域"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "セグメント"
|
||||
"message": "区域"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "この提案を支持する"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "報告"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "この提案が正しくないことを報告する。"
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "無視"
|
||||
},
|
||||
@@ -24,11 +43,44 @@
|
||||
"Hide": {
|
||||
"message": "非表示"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "元の場所に戻るには「スキップを取り消す」をクリックしてください。"
|
||||
},
|
||||
"unskip": {
|
||||
"message": "スキップしない"
|
||||
"message": "スキップを取り消す"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "再スキップ"
|
||||
},
|
||||
"paused": {
|
||||
"message": "一時停止"
|
||||
"message": "一時停止中"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "タイマーが停止しました"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "個々の値を編集・削除するには、情報ボタンをクリックするか右上隅にある拡張機能のアイコンをクリックして拡張機能のポップアップを表示します。"
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "本当に消去しますか?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "スポンサー表示の投稿中にエラーが発生しました。しばらく経ってからもう一度お試しください。"
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "この動画用の区域は情報集合体に登録されています!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "区域が見つかりませんでした"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "区域が始まりました"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "区域が終わりました"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "YouTube動画が見つかりませんでした。\nこれが正しくない場合は、タブを再読み込みしてください。"
|
||||
},
|
||||
"success": {
|
||||
"message": "成功しました!"
|
||||
@@ -36,30 +88,76 @@
|
||||
"voted": {
|
||||
"message": "投票しました!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "サーバーがダウンしているようです。今すぐ開発者にお知らせください。"
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "接続エラーが発生しました。エラーコード: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "次の動画IDで提出します:"
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "区域を消去"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "SponsorBlock のポップアップを開く"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "ポップアップを閉じる"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "区域を提出"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "本当に提出してよろしいですか?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "ホワイトリストのチャンネル"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "ホワイトリストからチャンネルを削除"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "区域に投票"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "提出数"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "次のセグメント数から人々を救いました: "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "リーダーボード"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "送信"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "提出をクリックするとセクション編集画面が表示されます",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "ヒント: オプションから提出時のキーバインドを設定できます"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "時間をクリア"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "時間を提出"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "これは公開の統計ページであなたがどれだけ貢献したかを示すために使用され、ここで確認することができます: "
|
||||
},
|
||||
"Username": {
|
||||
"message": "ユーザー名"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "ユーザー名を設定"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "非表示にする"
|
||||
},
|
||||
@@ -72,12 +170,52 @@
|
||||
"hideButtons": {
|
||||
"message": "YouTube プレイヤーにボタンを表示しない"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "これを有効にするとYouTube再生画面の区域提出UIが非表示になります。"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "YouTubeプレーヤーの情報ボタンを表示する"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "YouTubeプレーヤーの情報ボタンを隠す"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "これはYouTubeのページ上でポップアップを開くためのボタンです。"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "YouTube プレイヤーから削除ボタンを隠す"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube プレイヤーから削除ボタンを表示する"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "これはYouTube再生画面上のUIで,現在の動画から未提出の区域を全て消去します。"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "スキップ回数の統計を有効にする"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "この機能は、あなたが飛び越した区域を追跡して、当該区域がどれだけ役に立ったかを他の利用者に知らせることで、不正な情報が情報集合体に紛れないようにするための評価基準として使用されます。あなたが区域を飛び越すたびに、拡張機能はサーバーに通報を送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "ハッシュプレフィックスを使って要求"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "サーバーに区域を要求する際に,動画IDの代わりに動画IDのハッシュから最初の4文字を送信します。それに対して,サーバーは類似したハッシュを持つすべての動画の情報を応答します。"
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "新しい動画では区域を再取得する"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "動画がまだ新しく区域が見つからない場合は、動画を視聴している間、数分おきに区域を検索し続けます。"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "再度通知を表示する"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "ウェブサイト",
|
||||
"description": "Used on Firefox Store Page"
|
||||
@@ -86,6 +224,45 @@
|
||||
"message": "ソースコード",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "通知がアップグレードされました!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "もしそれでも気に入らない場合は、非表示ボタンをクリックしてください。",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "セグメントをスキップするキーを設定"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "セグメントを開始するキーを設定"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "投稿するキーを設定"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "キーを入力して設定します"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "キーバインドを次の通り設定しました: "
|
||||
},
|
||||
"0": {
|
||||
"message": "接続がタイムアウトになりました。インターネット接続をご確認ください。接続に問題がない場合、サーバーが混雑またはダウンしている可能性があります。"
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "スキップは有効です"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "スキップは無効です"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "あなたの貢献",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "サーバーが混雑中です。数秒後にもう一度お試しください。"
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "エラーコード: "
|
||||
},
|
||||
@@ -107,8 +284,20 @@
|
||||
"audioNotification": {
|
||||
"message": "オーディオ通知をスキップ"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "スキップ時の音声通知は、セグメントがスキップされる毎に音を鳴らす機能です。無効 (または自動スキップが無効) の場合、音は再生されません。"
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "スキップした分を除いた時間を表示する"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "この時間は、シークバーの下にある現在の時間の隣に表示されます。これは、動画の合計時間からすべてのセグメントの時間を差し引いたもので「シークバーに表示」として設定されているセグメントも含まれます。"
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "スキップしました "
|
||||
"message": "スキップしたセグメント数: "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "ご自身の時間をこれだけ節約しました: "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "分"
|
||||
@@ -122,15 +311,75 @@
|
||||
"hoursLower": {
|
||||
"message": "時間"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "他の人々の時間をこれだけ節約しました:"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": "(彼らの人生のうち)"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "サーバーの状態についてはstatus.sponsor.ajay.appを確認してください。"
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "利用者IDの読み込み・書き出し"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "これを公開してはいけません。これは暗証語のようなものであり,誰とも共有するべきではありません。これを持っている人はあなたになりすませてしまいます。"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "利用者IDを設定"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "警告: 利用者IDの変更は恒久的です。本当に実行しますか? 念のため,旧IDを控えておいてください。"
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "作成者"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "自動スキップ"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "区域を飛び越した後に通知を表示する"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。現在の設定は:"
|
||||
},
|
||||
"supportInvidious": {
|
||||
"message": "Invidiousに対応"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) は第三者製のYouTubeクライアントです。Invidious対応を有効にするには,追加の権限を受け入れなければいけません。 これはChromeやその他のChromium系列の匿名閲覧状態では動作しません。"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Invidious対応を有効にし,自動飛越を無効にし,GUIを非表示にします。"
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Invidiousインスタンスを追加"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "任意のInvidiousインスタンスを追加します。ドメイン名だけを記入してください。例: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "追加"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "無効なドメイン名です。ドメイン部分だけを含めてください。例: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Invidiousインスタンス一覧を初期化"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "Invidiousインスタン一覧を初期化しようとしています"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "現在のインスタンス:"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "飛越す最短の時間(秒):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "設定値より短い区域は飛び越されず,再生画面にも表示されません。"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock サーバーアドレス"
|
||||
},
|
||||
@@ -143,6 +392,9 @@
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com は現在サポートされています"
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "区域を提出"
|
||||
},
|
||||
"submit": {
|
||||
"message": "送信"
|
||||
},
|
||||
@@ -158,6 +410,10 @@
|
||||
"edit": {
|
||||
"message": "編集"
|
||||
},
|
||||
"to": {
|
||||
"message": "~",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "スポンサー"
|
||||
},
|
||||
@@ -173,6 +429,9 @@
|
||||
"category_selfpromo": {
|
||||
"message": "無報酬 / セルフプロモーション"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "音楽: 音楽ではない区間"
|
||||
},
|
||||
"disable": {
|
||||
"message": "無効"
|
||||
},
|
||||
@@ -193,7 +452,7 @@
|
||||
"message": "カテゴリ"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "スキップ オプション",
|
||||
"message": "飛越設定",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
@@ -205,9 +464,24 @@
|
||||
"chooseACategory": {
|
||||
"message": "カテゴリーを選択"
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "提出する全ての区域について,その範疇を選択する必要があります!"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"message": "まだチャンネル ID が読み込まれてません。"
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "SponsorBlockがYouTube APIを参照できないようです。修正するには,次に表示される画面で許可を承認してから,数秒後に再読み込みしてください。"
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "許可を承認する"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "許可要求が成功しました。"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "権限要求に失敗しました。承認を拒否しましたか?"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "カテゴリが違います"
|
||||
},
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "광고 구간 끝"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "구간 생성 취소"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "유튜브 동영상을 찾을 수 없습니다.\n오류라면, 탭을 새로고침해보세요."
|
||||
},
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "정말로 초기화하시겠습니까?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "이 영상은 일부 공개 영상으로 감지되었습니다. 구간 스킵을 확인하지 않으려면 취소를 누르세요."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "일부 공개/비공개 영상 무시"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "이 설정은 SponsorBlock을 약간 느리게 만듭니다. 건너뛰기 부분 질의는 서버에 영상 ID를 전송해야 합니다. 목록에 없는 영상 ID가 인터넷으로 전송되는 것이 우려된다면 이 옵션을 활성화 해주세요."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "이제 m.youtube.com 링크를 지원합니다"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "채널 ID가 로드되지 않았습니다."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "무언가가 SponsorBlock의 영상 데이터 수집을 막고 있는 것으로 보입니다. 이것은 광고 차단기로 인해 그럴 가능성이 있습니다. https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests 사이트를 참조하세요"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "무언가가 SponsorBlock의 동영상 데이터 수집을 막고 있는 것 같습니다. https://github.com/ajayyy/SponsorBlock/issues/741 사이트를 참조하세요."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "이 문제를 해결할 수 없는 경우, SponsorBlock이 이 동영상에 대한 보이는 정보를 찾을 수 없으므로 '일부 공개/비공개 동영상 무시' 설정을 꺼주십시오."
|
||||
"youtubePermissionRequest": {
|
||||
"message": "SponsorBlock이 YouTube API에 접근할 수 없는 것으로 보입니다. 이 문제를 해결하려면, 다음에 뜨는 권한 창에서 권한을 허용해주시고 잠시 기다린 뒤, 페이지를 새로고침하십시오."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "권한 허용"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "권한 요청에 성공했습니다!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "권한 요청에 실패했습니다. 거부를 누르셨나요?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "이 문제를 해결할 수 없는 경우, SponsorBlock이 이 동영상에 대한 채널 정보를 찾을 수 없으므로 '건너뛰기 전 채널 강제 체크' 설정을 꺼주십시오."
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "오류가 지속된다면, 광고 차단기로 인해 발생할 수 있습니다. https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests 사이트를 참조하세요"
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "ഇത് പുന reset സജ്ജമാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "വീഡിയോ ലിസ്റ്റുചെയ്യാത്തതായി കണ്ടെത്തി. ഒഴിവാക്കൽ സെഗ്മെന്റുകൾ പരിശോധിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നില്ലെങ്കിൽ റദ്ദാക്കുക ക്ലിക്കുചെയ്യുക."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "ലിസ്റ്റുചെയ്യാത്ത / സ്വകാര്യ വീഡിയോകൾ അവഗണിക്കുക"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "ഈ ക്രമീകരണം സ്പോൺസർബ്ലോക്കിനെ ചെറുതായി മന്ദഗതിയിലാക്കും. സെഗ്മെന്റ് തിരയലുകൾ ഒഴിവാക്കുക സെർവറിലേക്ക് വീഡിയോ ഐഡി അയയ്ക്കേണ്ടതുണ്ട്. ലിസ്റ്റുചെയ്യാത്ത വീഡിയോ ഐഡികൾ ഇൻറർനെറ്റിലൂടെ അയയ്ക്കുന്നതിനെക്കുറിച്ച് നിങ്ങൾക്ക് ആശങ്കയുണ്ടെങ്കിൽ, ഈ ഓപ്ഷൻ പ്രാപ്തമാക്കുക."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com ഇപ്പോൾ പിന്തുണയ്ക്കുന്നു"
|
||||
},
|
||||
@@ -591,12 +582,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ചാനൽ ഐഡി ഇതുവരെ ലോഡുചെയ്തിട്ടില്ല."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "വീഡിയോ ഡാറ്റ നേടാനുള്ള സ്പോൺസർബ്ലോക്കിന്റെ കഴിവ് എന്തോ തടയുന്നുവെന്ന് തോന്നുന്നു. ഇത് മിക്കവാറും നിങ്ങളുടെ പരസ്യ ബ്ലോക്കറാണ്. Https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests പരിശോധിക്കുക"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "നിങ്ങൾക്ക് ഇത് പരിഹരിക്കാൻ കഴിയുന്നില്ലെങ്കിൽ, ഈ ലിസ്റ്റിനായുള്ള ദൃശ്യപരത വിവരങ്ങൾ വീണ്ടെടുക്കാൻ സ്പോൺസർബ്ലോക്കിന് കഴിയാത്തതിനാൽ 'ലിസ്റ്റുചെയ്യാത്ത / സ്വകാര്യ വീഡിയോകൾ അവഗണിക്കുക' എന്ന ക്രമീകരണം അപ്രാപ്തമാക്കുക"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "ഇത് സംഭവിച്ചുകൊണ്ടിരിക്കുകയാണെങ്കിൽ, ഇത് നിങ്ങളുടെ പരസ്യ ബ്ലോക്കർ കാരണമാകാം. Https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests പരിശോധിക്കുക"
|
||||
},
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Adakah anda pasti mahu menetapkan semula ini?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Video tersebut dikesan sebagai tidak tersenarai. Klik batal jika anda tidak mahu memeriksa segmen langkau."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Abaikan Video Tidak Tersenarai / Peribadi"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Tetapan ini sedikit melambatkan SponsorBlock. Skip segmen carian memerlukan penghantaran ID video ke pelayan. Sekiranya anda bimbang tentang ID video yang tidak tersenarai dihantar melalui internet, aktifkan pilihan ini."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com kini disokong"
|
||||
},
|
||||
@@ -591,12 +582,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID Saluran belum dimuat."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Nampaknya ada sesuatu yang menyekat kemampuan SponsorBlock untuk mendapatkan data video. Ini mungkin penyekat iklan anda. Sila periksa https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Sekiranya anda tidak dapat menyelesaikannya, maka matikan tetapan 'Abaikan video tidak tersenarai / peribadi', kerana SponsorBlock tidak dapat mengambil maklumat keterlihatan untuk video ini"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Sekiranya ini terus berlaku, ini mungkin disebabkan oleh penyekat iklan anda. Sila periksa https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segment eindigt nu"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Segment aanmaken annuleren"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Geen YouTube-video gevonden.\nVernieuw het tabblad als dit onjuist is."
|
||||
},
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Weet u zeker dat u dit wilt herstellen?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "De video is als onvermeld gedetecteerd. Klik op annuleren als u niet wilt controleren op segmenten om over te slaan."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Onvermelde/privé-video's negeren"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Deze instelling zal SponsorBlock iets vertragen. Opzoeken van segmenten om over te slaan vereist het versturen van de video-ID naar de server. Schakel deze optie in als u bezorgd bent over het versturen van ID's van onvermelde video's via internet."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com wordt nu ondersteund"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanaal-ID is nog niet geladen."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Het lijkt erop dat iets de mogelijkheid van SponsorBlock om videogegevens te krijgen blokkeert. Dit is waarschijnlijk uw reclamefilter. Zie https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocks-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Het lijkt erop dat iets de mogelijkheid van SponsorBlock om videogegevens op te halen, blokkeert. Zie https://github.com/ajayyy/SponsorBlock/issues/741 voor meer informatie."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Als u dit niet kunt oplossen, schakel dan de instelling 'onvermelde/privé-video's negeren' uit omdat SponsorBlock niet in staat is de zichtbaarheidsinformatie voor deze video op te halen"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Het lijkt erop dat SponsorBlock de YouTube API niet kan bereiken. Om dit op te lossen, accepteer het machtigingsverzoek dat hierna wordt weergegeven, wacht een aantal seconden en laad de pagina vervolgens opnieuw."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Machtiging accepteren"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Verzoek om machtiging gelukt!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Verzoek om machtiging mislukt. Heeft u op geweigerd geklikt?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Als u dit niet kunt oplossen, schakel dan de instelling 'kanaalcontrole forceren vóór overslaan' uit omdat SponsorBlock niet in staat is de kanaalinformatie voor deze video op te halen"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Als dit blijft optreden, kan dit worden veroorzaakt door uw reclamefilter. Zie https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Er du sikker på at du vil tilbakestille dette?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Denne videoen har blitt oppdaget å være uoppført. Klikk Avbryt hvis du ikke vil se etter hoppesegmenter."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignorer uoppførte/private videoer"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Denne innstillingen vil gjøre SponsorBlock marginalt tregere. Å se etter segmenter å hoppe over, krever å sende inn video-ID-en til tjeneren. Hvis du er bekymret for at uoppførte video-ID-er blir sendt over internettet, skru på denne innstillingen."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com er nå støttet"
|
||||
},
|
||||
@@ -591,11 +582,17 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanal-ID-en er ikke lastet inn enda."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Det ser ut som noe blokkerer SponsorBlock sin evne til å innhente videodata. Det er sannsynligvis reklameblokkereren din. Vennligst sjekk https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Det ser ut til at SponsorBlock ikke klarer å nå YouTube-API-en. For å fikse dette, godta tillatelsesspørringen som dukker opp etter dette, vent noen sekunder, og så last inn siden på nytt."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Hvis du ikke klarer å løse dette, skru av innstillingen «Ignorer uoppførte/private videoer», siden SponsorBlock er ute av stand til å innhente synlighetsinformasjonen til denne videoen."
|
||||
"acceptPermission": {
|
||||
"message": "Godta tillatelse"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Tillatelsesforespørselen lyktes!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Tillatelsesforespørselen mislyktes, klikket du på Avvis?"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Hvis dette skjer til stadighet, kan det være forårsaket av reklameblokkereren din. Vennligst sjekk https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
"message": "Zgłoszenia"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Oszczędzono innym "
|
||||
"message": "Oszczędziłeś innym "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Ranking"
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Czy na pewno chcesz to zresetować?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Ten film został wykryty jako niepubliczny. Kliknij Anuluj, jeśli nie chcesz sprawdzać, czy są dla niego segmenty."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignoruj niepubliczne/prywatne filmy"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Ta opcja spowolni nieco SponsorBlock. Wyszukiwanie istniejących segmentów wymaga wysłania ID filmu do serwera. Jeśli niepokoi Cię fakt wysyłania przez internet ID niepublicznych filmów, włącz tę opcję."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com jest teraz wspierany"
|
||||
},
|
||||
@@ -591,11 +582,17 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID kanału nie zostało póki co załadowane."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Wygląda na to, że coś blokuje możliwość pobierania danych o filmach przez SponsorBlock. To prawdopodobnie Twój ad blocker. Sprawdź proszę https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Wygląda na to, że SponsorBlock nie jest w stanie połączyć się z API YouTube. Aby to naprawić, zaakceptuj monit o pozwolenie, który pojawi się za chwilę, odczekaj kilka sekund, a następnie odśwież stronę."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Jeżeli nie możesz naprawić tego to wyłącz w ustawieniach opcję \"Ignoruj prywatne filmy\", ponieważ SponsorBlock nie może uzyskać informacji o widoczności tego filmu"
|
||||
"acceptPermission": {
|
||||
"message": "Zaakceptuj uprawnienie"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Uzyskano uprawnienia!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Prośba odrzucona. Może kliknięto „Odmów”?"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Jeśli ten problem się powtarza, możliwą przyczyną jest Twój ad blocker. Sprawdź proszę https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
"message": "Pausado"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Tempo parado"
|
||||
"message": "Temporizador parado"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "\n\nPara editar ou remover linhas individuais, clique com o botão direito ou abra o popup da extensão pelo icone no canto superior direito."
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "O segmento termina agora"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Cancelar Criação de Segmento"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nenhum vídeo do YouTube encontrado.\nSe isto estiver incorreto, atualize a aba."
|
||||
},
|
||||
@@ -125,7 +128,7 @@
|
||||
"message": "Envios"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Você salvou pessoas de "
|
||||
"message": "Poupaste a outros de "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Placar de classificação"
|
||||
@@ -147,7 +150,7 @@
|
||||
"message": "Enviar Intervalos"
|
||||
},
|
||||
"publicStats": {
|
||||
"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á contribuiu. Veja-a"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Nome de usuário"
|
||||
@@ -171,7 +174,7 @@
|
||||
"message": "Esconder botões no player do Youtube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Isto esconde os botões que aparecem no player do Youtube para submeter patrocínios. Entendemos que possa ser\n incómodo a algumas pessoas. Em vez de usar esses botões pode usar os do popup. Para esconder a mensagem que aparece, \n ususe o botão na mesma que diz \"Don't show this again\". Pode sempre reactivar estas definições novamente."
|
||||
"message": "Esta opção esconde os botões que aparecem para enviar segmentos no player do YouTube."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Mostrar botão de Informações no player do Youtube"
|
||||
@@ -315,7 +318,7 @@
|
||||
"message": "Você poupou das pessoas"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " de suas vidas"
|
||||
"message": " das vidas dos outros"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Verifique status.sponsor.ajay.app para o status do servidor."
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Tem certeza que deseja redefinir?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "O vídeo foi detectado como não listado. Clique em cancelar se você não deseja verificar se há segmentos pulados."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignorar vídeos não listados/privados"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Esta configuração diminuirá um pouco o desempenho do SponsorBlock. As pesquisas do segmento exigem que se envie o ID do vídeo para o servidor. Se você estiver preocupado com o envio de IDs de vídeo não listados pela internet, habilite essa opção."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com agora é suportado"
|
||||
},
|
||||
@@ -423,13 +417,13 @@
|
||||
"message": "Importar/Exportar Todas as Opções"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Essa suas preferências em JSON. Isso inclui seu ID de usuário, então lembre-se de compartilhar com cuidado."
|
||||
"message": "Essas são suas preferências no formato JSON. Isso inclui seu ID de usuário, então lembre-se de compartilhar com cuidado."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Definir Opções"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "Aviso: Alterar as opções é permanente e pode fazer a extensão parar de funcionar. Tem certeza que deseja fazer isso? Certifique-se de fazer um backup de seu antigo por precaução."
|
||||
"message": "Aviso: Alterar as opções é permanente e pode fazer a extensão parar de funcionar. Tem certeza que deseja fazer isso? Certifique-se de fazer um backup por precaução."
|
||||
},
|
||||
"incorrectlyFormattedOptions": {
|
||||
"message": "Este JSON não está formatado corretamente. Suas opções não foram alteradas."
|
||||
@@ -487,7 +481,7 @@
|
||||
"message": "Intervalo/Animação de Introdução"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Um intervalo sem conteúdo real. Pode ser um quadro em pausa, um frame estático, repetindo animação. Isso não deve ser usado para transições que contenham informação."
|
||||
"message": "Um intervalo sem conteúdo real. Pode ser uma pausa, um quadro estático, uma animação repetitiva. Isso não deve ser usado em transições que contenham informação."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Intervalo"
|
||||
@@ -502,7 +496,7 @@
|
||||
"message": "Lembrete de interação (inscrever-se)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Quando houver um pequeno lembrete para curtir, inscreva-se ou segui-los no meio do conteúdo. Se é longo ou sobre algo específico, deveria ser sob auto-promoção."
|
||||
"message": "Quando houver um pequeno lembrete para curtir, inscrever-se ou segui-los no meio do conteúdo. Se é longo ou sobre algo específico, deveria ser sob Não-pago/Auto promoção."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Lembrete de interação"
|
||||
@@ -511,7 +505,7 @@
|
||||
"message": "Não-pago/Auto promoção"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Similar a \"patrocinador\", exceto para auto promoções e não-pagas. Isto inclui seções sobre vendas, doações ou informações sobre com quem colaboraram."
|
||||
"message": "Similar a \"patrocinador\", mas para auto promoções e segmentos não-pagos. Isto inclui seções sobre vendas, doações ou informações sobre com quem colaboraram."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Música: Seção sem música"
|
||||
@@ -541,7 +535,7 @@
|
||||
"message": "Sua cor está formatada incorretamente. Deve ser um código hexadecimal de 3 ou 6 dígitos com uma tralha / hashtag no início."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Cor de pré-visualização",
|
||||
"message": "Pré-visualizar cor",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID do canal ainda não carregado."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Parece que algo está bloqueando o SponsorBlock de obter dados de vídeo. Isso é provavelmente o seu bloqueador de anúncios. Por favor, verifique https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Parece que algo está bloqueando a habilidade do SponsorBlock de obter dados de vídeo. Por favor, veja https://github.com/ajayyy/SponsorBlock/issues/741 para mais informações."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Se você não consegue resolver isso, desative a configuração 'Ignorar vídeos não listados/privados', pois o SponsorBlock não pode recuperar as informações de visibilidade deste vídeo"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Parece que o SponsorBlock é incapaz de acessar a API do YouTube. Para corrigir isso, aceite a permissão do prompt que aparecerá a seguir, espere alguns segundos e recarregue a página."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Aceitar permissão"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Solicitação de permissão bem-sucedida!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Falha na solicitação de permissão. Você clicou em negar?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Se você não consegue resolver isso, desative a configuração 'Forçar Verificação do Canal Antes de Pular', pois o SponsorBlock não pode recuperar as informações deste vídeo"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Se isso continuar acontecendo, pode ser causado pelo seu bloqueador de anúncios. Por favor, verifique https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock-Requests"
|
||||
@@ -610,7 +616,7 @@
|
||||
"message": "Considere ativar a 'forçar verificação de canal antes de pular\""
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Incorreto/tempo errado"
|
||||
"message": "Tempo errado ou incorreto"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Categoria errada"
|
||||
@@ -619,7 +625,7 @@
|
||||
"message": "Este vídeo é categorizado como música. Tem certeza que isto tem um patrocinador? Se este é realmente um \"segmento não musical\", abra as opções da extensão e habilite esta categoria. Assim você pode enviar este segmento como \"não-musical\" ao invés de patrocinador. Por favor leia as diretrizes se estiver confuso."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Multiplos segmentos"
|
||||
"message": "Múltiplos segmentos"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Diretrizes"
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Sunteți sigur că doriți să resetați asta?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Acest videoclip a fost detectat ca nelistat. Faceți clic pe anulați dacă nu doriți să verificați segmentele de sărire."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignoră Videoclipurile Nelistate/Private"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Această setare va încetini puțin SponsorBlock. Căutările segmentelor de sărire 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"
|
||||
},
|
||||
@@ -588,9 +579,6 @@
|
||||
"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"
|
||||
},
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Пропускайте спонсорские вставки, просьбы подписаться и другое в видео на YouTube. Отправляйте информацию о спонсорах в видео, чтобы сохранять другим время.",
|
||||
"message": "Пропускайте спонсорские вставки, просьбы подписаться и другое в видео на YouTube. Отправляйте информацию о спонсорах в видео, чтобы экономить другим время.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
@@ -79,6 +79,9 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Сегмент заканчивается здесь"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Отменить создание сегмента"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Видео YouTube не найдено.\nЕсли это не так, обновите вкладку."
|
||||
},
|
||||
@@ -407,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Вы действительно хотите это сбросить?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Было обнаружено, что это видео - с доступом по ссылке. Нажмите \"отмена\", если не хотите проверять для него сегменты."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Игнорировать непубличные видео"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Эта настройка незначительно замедлит SponsorBlock. Поиск сегментов требует отправки идентификатора видео на сервер. Если Вас беспокоит отправка идентификаторов скрытых видео по интернету, включите эту настройку."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com теперь поддерживается"
|
||||
},
|
||||
@@ -591,11 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID канала еще не загружен."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Кажется, что-то блокирует возможность SponsorBlock'а получать данные о видео. Возможно, это ваш блокировщик рекламы. Пожалуйста, перейдите на https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Похоже, что-то блокирует возможность SponsorBlock'а получать данные о видео. Подробнее: https://github.com/ajayyy/SponsorBlock/issues/741."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Если вы не можете решить эту проблему, попробуйте отключить \"Игнорировать непубличные видео\" в настройках, т. к. SponsorBlock не может получить настройки доступа этого видео"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Кажется, SponsorBlock не может получить доступ к API YouTube. Чтобы исправить эту ошибку, дайте разрешение в окне, которое сейчас появится, подождите несколько секунд и затем перезагрузите страницу."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Дать разрешение"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Разрешение получено!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Не удалось получить разрешение, вы нажали на \"Блокировать\"?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Если вы не можете решить эту проблему, попробуйте отключить \"Принудительная проверка каналов перед пропуском\" в настройках, т. к. SponsorBlock не может определить название канала для этого видео"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Если это сообщения появляется слишком часто, это может быть вызвано вашим блокировщиком рекламы. Пожалуйста, перейдите на https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Naozaj to chcete obnoviť?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Toto video je nezaradené. Ak nechcete skontrolovať preskočiteľné segmenty, stlačte Zrušiť."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignorovať nezaradené a súkromné videá"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Toto nastavenie mierne spomalí SponsorBlock. Vyhľadávanie segmentov na preskočenie si vyžaduje odoslanie ID videa na server. Ak si nie ste istí odosielaním ID nezaradených videí cez internet, tak toto nastavenie zapnite."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "už je podporované aj m.youtube.com"
|
||||
},
|
||||
@@ -591,23 +582,29 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID kanála nie je zatiaľ načítané."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Zdá sa, že niečo blokuje SponsorBlocku možnosť získať dáta o videu. Pravdepodobne to bude Váš adblocker. Prosím navštívte https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"youtubePermissionRequest": {
|
||||
"message": "SponsorBlock nemá prístup k YouTube API. Povoľte oprávnenie v nasledovnej výzve, počkajte pár sekúnd a znovu nahrajte stránku."
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Ak to neviete vyriešiť, vypnite nastavenie \"Ignorovať nezaradené a súkromné videá\", lebo SponsorBlock nevie zistiť viditeľnosť tohto videa"
|
||||
"acceptPermission": {
|
||||
"message": "Povoľte oprávnenie"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Povolenie oprávnenia zlyhalo, stlačili ste odmietnuť?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Ak to neviete vyriešiť, vypnite nastavenie \"Vynútiť kontrolu kanála pred preskočením\", lebo SponsorBlock nevie zistiť informácie o kanále tohto videa"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Ak sa to bude diať aj naďalej, môže to byť spôsobené Vašim adblockerom. Prosím navštívte https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Vynútiť Kontrolu Kanála Pred Preskočením"
|
||||
"message": "Vynútiť kontrolu kanála pred preskočením"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "V predvolenom nastavení sa preskočia segmenty hneď bez kontroly kanálu. V predvolenom nastavení môžu byť niektoré segmenty na začiatku videa na kanáloch pridaných na whitelist preskočené. Povolením tejto možnosti tomu zabránite, ale všetky preskakovania budú mať mierne oneskorenie, pretože získanie ID kanála môže chvíľu trvať. Toto oneskorenie nemusí byť viditeľné, ak máte rýchly internet."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Zvážte Povolenie \"Vynútiť Kontrolu Kanála Pred Preskočením\""
|
||||
"message": "Zvážte povolenie \"Vynútiť kontrolu kanála pred preskočením\""
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Nesprávne/Zlé načasovanie"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"message": "Den här har redan blivit rapporterad"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanal vitlistad!"
|
||||
"message": "Kanalen är vitlistad!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segment"
|
||||
@@ -41,16 +41,16 @@
|
||||
"message": "Laddar..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Visa Aldrig"
|
||||
"message": "Visa aldrig"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Tryck på Tillbaka för att ångra åtgärden."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Tillbaka"
|
||||
"message": "Hoppa inte över"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Framåt"
|
||||
"message": "Hoppa över"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pausad"
|
||||
@@ -79,11 +79,14 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segmentet slutar nu"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Avbryt skapandet av segmentet"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Hittade ingen YouTube-video.\nUppdatera fliken om detta är felaktigt."
|
||||
},
|
||||
"success": {
|
||||
"message": "Lyckades!"
|
||||
"message": "Klart!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Röstat!"
|
||||
@@ -137,8 +140,11 @@
|
||||
"message": "Sektionsredigering kommer att visas efter du har klickat på skicka",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Tips: Du kan ställa in snabbtangenter för de olika inskickningsalternativen"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Rensa Tider"
|
||||
"message": "Rensa tider"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Rapportera Tider"
|
||||
@@ -197,6 +203,9 @@
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Fråga efter hash-prefix"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "I stället för att begära segment från servern med hjälp av video-ID skickas de första 4 tecknen i hashen av video-ID:et. Servern kommer då att skicka tillbaka data för alla videor med liknande hashar."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Uppdatera segment på nya videor"
|
||||
},
|
||||
@@ -230,13 +239,13 @@
|
||||
"message": "Ställ in knapp för att hoppa över ett segment"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Ange den tangent som ska fungera som starttangent för ett segment"
|
||||
"message": "Ange den tangent som ska fungera som snabbstartstangent för ett segment"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Välj knapp att koppla till rapportering av sponsormeddelande"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Koppla knapp genom att trycka på den"
|
||||
"message": "Ange tangent genom att trycka på den"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Kopplad till: "
|
||||
@@ -345,7 +354,7 @@
|
||||
"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": {
|
||||
"message": "Aktivera Invidious stöd, avaktivera hoppa över automatiskt, dölj knappar och mer."
|
||||
"message": "Aktivera Invidious stöd, inaktivera hoppa över automatiskt, dölj knappar och mer."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Lägg Till Invidious Instans"
|
||||
@@ -401,15 +410,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Är du säker på att du vill rensa?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Den här videon verkar vara olistad. Klicka på avbryt om du inte vill söka efter överhoppade segment."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignorera Olistade Videor"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Den här inställningen kommer att slöa ner SponsorBlock. Segmentöverhoppssökningar kräver att video-ID skickas till servern. Om du är orolig över att olistade video-ID:s skickas över internet, aktivera då detta alternativ."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com stöds nu"
|
||||
},
|
||||
@@ -474,15 +474,24 @@
|
||||
"category_sponsor": {
|
||||
"message": "Sponsormeddelande"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Betald marknadsföring, betalda hänvisningar och direktannonser, men inte till egen marknadsföring eller gratis shoutouts till skapare/webbplatser/produkter de gillar."
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Paus/Introduktion"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Ett intervall utan faktiskt innehåll. Kan vara en paus, statisk ram, upprepande animation. Denna bör inte användas för övergångar som innehåller information."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Uppehåll"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Slutkort/Credits"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Credits eller när YouTube-slutkort visas. Inte för slut med information."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interaktionspåminnelse (Prenumerera)"
|
||||
},
|
||||
@@ -495,9 +504,15 @@
|
||||
"category_selfpromo": {
|
||||
"message": "Obetald/självbefodran"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Som \"sponsormeddelande\" men med undantag för obetald eller självkampanj. Detta inkluderar avsnitt om varor, donationer eller information om vem de samarbetade med."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musik: Icke-musikavsnitt"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Ska endast användas i musikvideor. Denna ska endast användas för delar av musikvideor som inte redan omfattas av en annan kategori."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Icke-musik"
|
||||
},
|
||||
@@ -508,7 +523,7 @@
|
||||
"message": "Läser meddelande"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Avaktivera"
|
||||
"message": "Inaktivera"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Hoppa Över Manuellt"
|
||||
@@ -570,8 +585,23 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanal-ID är inte inladdat än."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Det verkar som om något blockerar SponsorBlocks från att hämta videodata. Det beror förmodligen på din annonsblockerare. Vänligen kontrollera https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Det verkar som om något blockerar SponsorBlock från att hämta videodata. Gå till https://github.com/ajayyy/SponsorBlock/issues/741 för mer info."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Det verkar som att SponsorBlock inte kan nå YouTube-API:t. För att åtgärda problemet ska du acceptera behörighetsfrågan som visas härnäst och vänta några sekunder och sedan ladda om sidan."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Godkänn behörighet"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Behörighet godkänd!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Behörighetsbegäran misslyckades, tryckte du på förneka?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Om du inte kan lösa detta kan du inaktivera 'Tvinga kontroll av kanalen innan hoppa över' i inställningarna, eftersom SponsorBlock inte kan hämta kanalinformationen för den här videon"
|
||||
},
|
||||
"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"
|
||||
@@ -608,7 +638,7 @@
|
||||
"message": "Kategorier finns här!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Öppna inställningarna för att skippa intros, outros, merch, osv."
|
||||
"message": "Öppna inställningarna för att hoppa över intros, outros, merch, osv."
|
||||
},
|
||||
"help": {
|
||||
"message": "Hjälp"
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "இதை மீட்டமைக்க விரும்புகிறீர்களா?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "வீடியோ பட்டியலிடப்படாதது என கண்டறியப்பட்டுள்ளது. பகுதிகளைத் தவிர்க்க நீங்கள் விரும்பவில்லை எனில் ரத்துசெய் என்பதைக் கிளிக் செய்க."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "பட்டியலிடப்படாத / தனிப்பட்ட வீடியோக்களை புறக்கணிக்கவும்"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "இந்த அமைப்பு ஸ்பான்சர் பிளாக் சற்று மெதுவாக்கும். பிரிவு தேடல்களைத் தவிர் சேவையகத்திற்கு வீடியோ ஐடியை அனுப்ப வேண்டும். பட்டியலிடப்படாத வீடியோ ஐடிகள் இணையத்தில் அனுப்பப்படுவது குறித்து நீங்கள் கவலைப்பட்டால், இந்த விருப்பத்தை இயக்கவும்."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com இப்போது துணைபுரிகிறது"
|
||||
},
|
||||
@@ -591,12 +582,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "சேனல் ஐடி இன்னும் ஏற்றப்படவில்லை."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "வீடியோ தரவைப் பெறுவதற்கான ஸ்பான்சர் பிளாக் திறனை ஏதோ தடுக்கிறது என்று தெரிகிறது. இது உங்கள் விளம்பர தடுப்பாளராக இருக்கலாம். Https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests ஐ சரிபார்க்கவும்"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "இதை நீங்கள் தீர்க்க முடியாவிட்டால், 'பட்டியலிடப்படாத / தனிப்பட்ட வீடியோக்களைப் புறக்கணிக்கவும்' என்ற அமைப்பை முடக்கு, ஏனெனில் இந்த வீடியோவுக்கான தெரிவுநிலை தகவலை ஸ்பான்சர் பிளாக் பெற முடியவில்லை"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "இது தொடர்ந்து நடந்தால், அது உங்கள் விளம்பர தடுப்பாளரால் ஏற்படலாம். Https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests ஐ சரிபார்க்கவும்"
|
||||
},
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "మీరు దీన్ని రీసెట్ చేయాలనుకుంటున్నారా?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "వీడియో జాబితా చేయనిదిగా కనుగొనబడింది. మీరు విభాగాలను దాటవేయాలనుకుంటే రద్దు చేయి క్లిక్ చేయండి."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "జాబితా చేయని / ప్రైవేట్ వీడియోలను విస్మరించండి"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "ఈ సెట్టింగ్ స్పాన్సర్బ్లాక్ను కొద్దిగా నెమ్మదిస్తుంది. సెగ్మెంట్ శోధనను దాటవేయి వీడియో ID ని సర్వర్కు పంపడం అవసరం. జాబితా చేయని వీడియో ఐడిలను ఇంటర్నెట్ ద్వారా పంపడం గురించి మీకు ఆందోళన ఉంటే, ఈ ఎంపికను ప్రారంభించండి."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com కి ఇప్పుడు మద్దతు ఉంది"
|
||||
},
|
||||
@@ -591,12 +582,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ఛానెల్ ID ఇంకా లోడ్ కాలేదు."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "వీడియో డేటాను పొందే స్పాన్సర్బ్లాక్ సామర్థ్యాన్ని ఏదో అడ్డుకుంటున్నట్లు కనిపిస్తోంది. ఇది బహుశా మీ యాడ్ బ్లాకర్. దయచేసి https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests తనిఖీ చేయండి"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "మీరు దీన్ని పరిష్కరించలేకపోతే, స్పాన్సర్బ్లాక్ ఈ వీడియో కోసం దృశ్యమాన సమాచారాన్ని తిరిగి పొందలేకపోతున్నందున, 'జాబితా చేయని / ప్రైవేట్ వీడియోలను విస్మరించండి' సెట్టింగ్ను నిలిపివేయండి"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "ఇది జరుగుతూ ఉంటే, అది మీ ప్రకటన బ్లాకర్ వల్ల సంభవించవచ్చు. దయచేసి https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests తనిఖీ చేయండి"
|
||||
},
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Bunu sıfırlamak istediğinize emin misiniz?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Videonun liste dışı olduğu tespit edildi. Atlanan kısımları kontrol etmek istemiyorsanız iptal'i tıklayın."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Listedışı/Özel Videoları Görmezden Gel"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Bu ayar, SponsorBlock'u biraz yavaşlatacaktır. atlama kısımlarının bulunması için, video kimliğinin sunucuya gönderilmesini gerektirir. Listelenmemiş video kimliklerinin İnternet üzerinden gönderilmesi konusunda endişeleriniz varsa, bu seçeneği etkinleştirin."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com şu an desteklenmektedir"
|
||||
},
|
||||
@@ -516,6 +507,9 @@
|
||||
"category_music_offtopic": {
|
||||
"message": "Müzik: Müzik Olmayan Bölüm"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Yalnızca müzik videolarında kullanım içindir. Bu yalnızca başka bir kategoriye katılmamış müzik videolarının parçaları için kullanılmalıdır."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Müzik Olmayan Bölüm"
|
||||
},
|
||||
@@ -588,12 +582,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanal kimliği henüz yüklenmedi."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Bir şeyin SponsorBlock'un video bilgisi almasını engelliyor gibi görünüyor. Bu reklam engelleyiciniz olabilir. Lütfen şu adresi kontrol edin https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Bunu çözümleyemiyorsanız \"Liste dışı/gizli videoları göz ardı et\" seçeneğini kapatın, SponsorBlock bu videonun gizlilik bilgisini alamıyor"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Bunu sürekli yaşıyorsanız, reklam engelleyiciniz tarafından gerçekleşiyor olabilir. https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests adresini kontrol edin."
|
||||
},
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Ви дійсно хочете це скинути?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Було виявлено, що це відео - з доступом по посиланню. Натисніть \"скасування\", якщо не хочете перевіряти для нього сегменти."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ігнорувати непублічні відео"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Це налаштування дещо сповільнить SponsorBlock. Пошук сегментів вимагає надсилання ідентифікатора відео на сервер. Якщо Вас турбує надсилання ідентифікаторів прихованих відео по інтернету, включіть це налаштування."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com тепер підтримується"
|
||||
},
|
||||
@@ -591,12 +582,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "ID каналу ще не завантажений."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Здається, щось блокує можливість SponsorBlock'а отримувати дані про відео. Можливо, це ваш блокувальник реклами. Будь ласка, перейдіть на https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Якщо вам не вдалося вирішити це, вимкніть параметр \"Ігнорувати непублічні відео\", оскільки SponsorBlock не в змозі отримати інформацію про видимість цього відео"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Якщо це повідомлення з'являється занадто часто, це може бути викликано вашим блокувальником реклами. Будь ласка, перейдіть на https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
|
||||
@@ -404,15 +404,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "Bạn có chắc mình muốn thiết lập lại không?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Video này là video không công khai. Ấn hủy nếu bạn không muốn tìm xem có đoạn quảng cáo không."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Bỏ qua video không công khai/riêng tư"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Cài đặt này sẽ làm chậm SponsorBlock một chút. Mã video cần phải được gửi đến máy chủ để truy vấn đoạn quảng cáo. Nếu bạn quan ngại về việc mã video không công khai bị gửi qua mạng, hãy bật tùy chọn này."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com đã được hỗ trợ"
|
||||
},
|
||||
@@ -585,12 +576,6 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "Chưa đọc được ID của kênh."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Hình như có gì đó đã ngăn chặn SponsorBlock truy vấn dữ liệu của video. Có thể do trình chặn quảng cáo của bạn. Hãy kiểm tra ở đây: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "Nếu bạn không thể giải quyết được vấn đề này, hãy vô hiệu hoá cài đặt 'Bỏ qua video không công khai/riêng tư', vì SponsorBlock không thể lấy được thông tin hiển thị của video này"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Nếu lỗi này tiếp tục xuất hiện, nó có thể là do trình chặn quảng cáo của bạn. Hãy kiểm tra ở đây: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "您确定要重置它吗?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "检测到此视频为未公开列出视频。如果您不想进行跳过片段开始,请点击取消。"
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "忽略未找到记录的视频"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "此设置将略微减慢 SponsorBlock 的速度。查询可跳过片段时需要向服务器发送视频 ID。如果您对通过互联网发送不公开列出视频的 ID 有疑虑,请启用此选项。"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "现已支持 m.youtube.com"
|
||||
},
|
||||
@@ -591,11 +582,11 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "频道 ID 尚未加载。"
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "似乎某些东西正在阻止 SponsorBlock 获取视频数据的功能。它很可能是您的广告拦截器。请查看 https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"acceptPermission": {
|
||||
"message": "接受权限"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "如果您无法解决这个问题,请禁用“忽略未公开列出/私有视频”设置,因为 SpongorBlock 无法检索此视频是否可见"
|
||||
"permissionRequestSuccess": {
|
||||
"message": "权限请求成功!"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "如果这种情况不断发生,它可能是由您的广告拦截器引起的。请查看 https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -407,15 +407,6 @@
|
||||
"areYouSureReset": {
|
||||
"message": "您確定要重製這個嗎?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "此影片已被偵測為未列出。點擊取消以不檢查跳過片段"
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "忽略私人/未列出的影片"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "此設定會微微降低 SponsorBlock 的速度。跳過片段檢查會需要將影片 ID 送到伺服器。如果您對將未列出的影片被流出的話,啟用這個選項"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "現已支援 m.youtube.com"
|
||||
},
|
||||
@@ -588,11 +579,20 @@
|
||||
"channelDataNotFound": {
|
||||
"message": "頻道 ID 尚未載入"
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "似乎某些東西正在阻止 SponsorBlock 獲取影片資料的功能。它很可能是您的廣告攔截器。請查看 https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "似乎有東西在阻止 SponsorBlock 獲取影片資料。請查看 https://github.com/ajayyy/SponsorBlock/issues/741 以了解更多資訊。"
|
||||
},
|
||||
"adblockerIssueUnlistedVideosInfo": {
|
||||
"message": "如果您沒辦法解決這個問題,請停用\"忽略私人或不公開影片\",因為 SponsorBlock 無法獲取這部影片的可見性資料。"
|
||||
"acceptPermission": {
|
||||
"message": "允許權限"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "成功允許權限!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "允許權限失敗,您是不是按到拒絕了?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "如果您沒辦法解決這個問題,請停用\"強制在跳過前檢查頻道\",因為 SponsorBlock 無法獲取這部影片的頻道資料。"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "如果這種情況不斷發生,它可能是由您的廣告攔截器引起的。請查看 https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
|
||||
@@ -42,12 +42,12 @@
|
||||
<img src="https://i.imgur.com/caf5Bju.png">
|
||||
</span>
|
||||
|
||||
Videos will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are.
|
||||
Video segments will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are.
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
Whenever you skip a video, you will get a notice report that submission. If the timing seems wrong, report it! You can also vote in the popup. The extension auto upvotes it if you don't report it, so make sure to report when necessary (this can be disabled in the options).
|
||||
Whenever you skip a segment, you will get notice. If the timing seems wrong vote down by clicking downvote! You can also vote in the popup.
|
||||
</p>
|
||||
|
||||
<div class="center"><img height="120px" src="https://user-images.githubusercontent.com/12688112/63067735-5a638700-bede-11e9-8147-f321b57527ec.gif"></div>
|
||||
@@ -81,8 +81,8 @@
|
||||
<h1>This is too slow</h1>
|
||||
|
||||
<p>
|
||||
There are hotkeys if you want to use them. You must be focused on the YouTube player to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the appostrophe to submit.
|
||||
These can be changed in the options. If you don't use QWERTY, you should probably change the keybinds.
|
||||
There are hotkeys if you want to use them. You must be focused on the YouTube player to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit.
|
||||
These can be changed in the options. If you don't use QWERTY, you should probably change the keybinding.
|
||||
</p>
|
||||
|
||||
<h1>I hate these buttons, they are so ugly</h1>
|
||||
@@ -131,9 +131,9 @@
|
||||
|
||||
<p>The awesome <a href="https://github.com/omarroth/invidious/wiki/API">Invidious API</a> is used to grab the time the video was published.</p>
|
||||
|
||||
<p>Some icons made by <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p>
|
||||
<p>Some icons made by <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="https://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p>
|
||||
|
||||
<p>Some icons made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p>
|
||||
<p>Some icons made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="https://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></p>
|
||||
|
||||
<p style="text-align: center;"><a href="/oss-attribution/attribution.txt">Open Source Licenses</a></p>
|
||||
|
||||
|
||||
@@ -309,23 +309,6 @@
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="toggle" sync-option="hashPrefix">
|
||||
<label class="switch-container" label-name="__MSG_enableQueryByHashPrefix__">
|
||||
<label class="switch">
|
||||
<input type="checkbox" checked>
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</label>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="small-description">__MSG_whatQueryByHashPrefix__</div>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="toggle" sync-option="refetchWhenNotFound">
|
||||
<label class="switch-container" label-name="__MSG_enableRefetchWhenNotFound__">
|
||||
<label class="switch">
|
||||
@@ -343,23 +326,6 @@
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="toggle" sync-option="checkForUnlistedVideos">
|
||||
<label class="switch-container" label-name="__MSG_unlistedCheck__">
|
||||
<label class="switch">
|
||||
<input type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</label>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="small-description">__MSG_whatUnlistedCheck__</div>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="private-text-change" sync-option="userID" confirm-message="userIDChangeWarning">
|
||||
<div class="option-button trigger-button">
|
||||
__MSG_changeUserID__
|
||||
|
||||
28
public/permissions/index.html
Normal file
28
public/permissions/index.html
Normal file
@@ -0,0 +1,28 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<head>
|
||||
<title>Permissions - SponsorBlock</title>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<link href="styles.css" rel="stylesheet"/>
|
||||
|
||||
<script src="../js/vendor.js"></script>
|
||||
<script src="../js/permissions.js"></script>
|
||||
</head>
|
||||
|
||||
<body class="sponsorBlockPageBody">
|
||||
|
||||
<div id="title" class="titleBar">
|
||||
<img src="../icons/LogoSponsorBlocker256px.png" height="80" class="profilepic"/>
|
||||
SponsorBlock
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
|
||||
<div class="center">
|
||||
<div id="acceptPermissionButton" class="option-button inline">
|
||||
__MSG_acceptPermission__
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
356
public/permissions/styles.css
Normal file
356
public/permissions/styles.css
Normal file
@@ -0,0 +1,356 @@
|
||||
/* Options page CSS */
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.inline {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.keybind-status {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.small-description {
|
||||
color: white;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.medium-description {
|
||||
color: white;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.option-text-box {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
.option-button {
|
||||
cursor: pointer;
|
||||
|
||||
background-color: #c00000;
|
||||
padding: 10px;
|
||||
color: white;
|
||||
border-radius: 5px;
|
||||
font-size: 14px;
|
||||
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
.option-button:hover {
|
||||
background-color: #fc0303;
|
||||
}
|
||||
|
||||
.option-button.disabled {
|
||||
cursor: default;
|
||||
|
||||
background-color: #520000;
|
||||
color: grey;
|
||||
}
|
||||
|
||||
#options {
|
||||
max-width: 60%;
|
||||
text-align: left;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.switch-container:after {
|
||||
content: attr(label-name);
|
||||
position: absolute;
|
||||
padding: 4px;
|
||||
width: max-content;
|
||||
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.text-label-container {
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 40px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #707070;
|
||||
}
|
||||
|
||||
.animated * {
|
||||
-webkit-transition: .4s;
|
||||
transition: .4s;
|
||||
}
|
||||
|
||||
.slider:before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
left: 4px;
|
||||
bottom: 4px;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.animated .slider:before {
|
||||
-webkit-transition: .4s;
|
||||
transition: .4s;
|
||||
}
|
||||
|
||||
input:checked + .slider {
|
||||
background-color: #fc0303;
|
||||
}
|
||||
|
||||
input:checked + .slider:before {
|
||||
-webkit-transform: translateX(16px);
|
||||
-ms-transform: translateX(16px);
|
||||
transform: translateX(16px);
|
||||
}
|
||||
|
||||
/* Rounded sliders */
|
||||
.slider.round {
|
||||
border-radius: 34px;
|
||||
}
|
||||
|
||||
.slider.round:before {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
|
||||
/* Boilerplate CSS from https://ajay.app */
|
||||
|
||||
body {
|
||||
background-color: #333333;
|
||||
}
|
||||
|
||||
.projectPreview {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.projectPreviewImage {
|
||||
position: absolute;
|
||||
left: -90px;
|
||||
width: 80px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.projectPreviewImageLarge {
|
||||
position: absolute;
|
||||
left: -210px;
|
||||
width: 200px;
|
||||
top: 50%;
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
|
||||
.projectPreviewImageLargeRight {
|
||||
position: absolute;
|
||||
right: -210px;
|
||||
width: 200px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.createdBy {
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#title {
|
||||
background-color: #636363;
|
||||
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
|
||||
font-size: 50px;
|
||||
color: #212121;
|
||||
|
||||
padding: 20px;
|
||||
|
||||
text-decoration: none;
|
||||
|
||||
transition: font-size 1s;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 40px;
|
||||
color: #dad8d8;
|
||||
|
||||
padding-top: 10px;
|
||||
|
||||
transition: font-size 0.4s;
|
||||
}
|
||||
|
||||
.subtitle:hover {
|
||||
font-size: 45px;
|
||||
|
||||
transition: font-size 0.4s;
|
||||
}
|
||||
|
||||
.profilepic {
|
||||
background-color: #636363 !important;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.profilepiccircle {
|
||||
vertical-align: middle;
|
||||
overflow: hidden;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: underline;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.link {
|
||||
padding: 20px;
|
||||
|
||||
height: 80px;
|
||||
|
||||
transition: height 0.2s;
|
||||
}
|
||||
|
||||
.link:hover {
|
||||
height: 95px;
|
||||
|
||||
transition: height 0.2s;
|
||||
}
|
||||
|
||||
#contact,.smalllink {
|
||||
font-size: 25px;
|
||||
color: #e8e8e8;
|
||||
|
||||
text-align: center;
|
||||
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#contact {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
p,li {
|
||||
font-size: 20px;
|
||||
color: #c4c4c4;
|
||||
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
p,li,code,a {
|
||||
max-width: 60%;
|
||||
text-align: left;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
@media screen and (orientation:portrait) {
|
||||
p,li,code,a {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.projectPreviewImage {
|
||||
position: unset;
|
||||
width: 130px;
|
||||
display: block;
|
||||
margin: auto;
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
.previewImage {
|
||||
max-height: 200px;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#recentPostTitle {
|
||||
font-size: 30px;
|
||||
color: #dad8d8;
|
||||
}
|
||||
|
||||
#recentPostDate {
|
||||
font-size: 15px;
|
||||
color: #dad8d8;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #dad8d8;
|
||||
}
|
||||
|
||||
svg {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.number-container:before {
|
||||
content: attr(label-name);
|
||||
padding-right: 4px;
|
||||
width: max-content;
|
||||
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* React styles */
|
||||
|
||||
.categoryTableElement {
|
||||
font-size: 16px;
|
||||
|
||||
color: white;
|
||||
}
|
||||
|
||||
.categoryTableElement > * {
|
||||
padding-right: 15px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.categoryOptionsSelector {
|
||||
background-color: #c00000;
|
||||
color: white;
|
||||
|
||||
border: none;
|
||||
font-size: 14px;
|
||||
padding: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.categoryColorTextBox {
|
||||
width: 60px;
|
||||
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
@@ -71,7 +71,7 @@
|
||||
</div>
|
||||
<div id="submissionSection" style="display: none">
|
||||
<b style="display: block; margin-top: 12px;">__MSG_submissionEditHint__</b>
|
||||
<div id="submitTimesContainer" style="display: none; margin-top: 12px;">
|
||||
<div id="submitTimesContainer" style="margin-top: 12px;">
|
||||
<button id="submitTimes" class="mediumButton">__MSG_submitTimesButton__</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -37,6 +37,9 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
case "openHelp":
|
||||
chrome.tabs.create({url: chrome.runtime.getURL('help/index_en.html')});
|
||||
return;
|
||||
case "openPage":
|
||||
chrome.tabs.create({url: chrome.runtime.getURL(request.url)});
|
||||
return;
|
||||
case "sendRequest":
|
||||
sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => {
|
||||
callback({
|
||||
|
||||
@@ -344,7 +344,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
//if it is not a complete sponsor time
|
||||
if (sponsorTimes[index].segment.length < 2) {
|
||||
//update video player
|
||||
this.props.contentContainer().changeStartSponsorButton(true, false);
|
||||
this.props.contentContainer().updateEditButtonsOnPlayer();
|
||||
}
|
||||
|
||||
sponsorTimes.splice(index, 1);
|
||||
@@ -359,7 +359,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
this.props.submissionNotice.cancel();
|
||||
|
||||
//update video player
|
||||
this.props.contentContainer().changeStartSponsorButton(true, false);
|
||||
this.props.contentContainer().updateEditButtonsOnPlayer();
|
||||
} else {
|
||||
//update display
|
||||
this.props.submissionNotice.forceUpdate();
|
||||
|
||||
@@ -6,6 +6,7 @@ const utils = new Utils();
|
||||
|
||||
interface SBConfig {
|
||||
userID: string,
|
||||
/** Contains unsubmitted segments that the user has created. */
|
||||
segmentTimes: SBMap<string, SponsorTime[]>,
|
||||
defaultCategory: string,
|
||||
whitelistedChannels: string[],
|
||||
@@ -34,8 +35,8 @@ interface SBConfig {
|
||||
audioNotificationOnSkip,
|
||||
checkForUnlistedVideos: boolean,
|
||||
testingServer: boolean,
|
||||
hashPrefix: boolean,
|
||||
refetchWhenNotFound: boolean,
|
||||
ytInfoPermissionGranted: boolean,
|
||||
|
||||
// What categories should be skipped
|
||||
categorySelections: CategorySelection[],
|
||||
@@ -167,8 +168,8 @@ const Config: SBObject = {
|
||||
audioNotificationOnSkip: false,
|
||||
checkForUnlistedVideos: false,
|
||||
testingServer: false,
|
||||
hashPrefix: true,
|
||||
refetchWhenNotFound: true,
|
||||
ytInfoPermissionGranted: false,
|
||||
|
||||
categorySelections: [{
|
||||
name: "sponsor",
|
||||
|
||||
496
src/content.ts
496
src/content.ts
@@ -1,6 +1,6 @@
|
||||
import Config from "./config";
|
||||
|
||||
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, FetchResponse, VideoInfo, StorageChangesObject } from "./types";
|
||||
import { SponsorTime, IncompleteSponsorTime, CategorySkipOption, VideoID, SponsorHideType, FetchResponse, VideoInfo, StorageChangesObject } from "./types";
|
||||
|
||||
import { ContentContainer } from "./types";
|
||||
import Utils from "./utils";
|
||||
@@ -71,8 +71,11 @@ let channelWhitelisted = false;
|
||||
// create preview bar
|
||||
let previewBar: PreviewBar = null;
|
||||
|
||||
//the player controls on the YouTube player
|
||||
let controls = null;
|
||||
/** Element containing the player controls on the YouTube player. */
|
||||
let controls: HTMLElement | null = null;
|
||||
|
||||
/** Contains buttons created by `createButton()`. */
|
||||
const playerButtons: Record<string, {button: HTMLButtonElement, image: HTMLImageElement}> = {};
|
||||
|
||||
// Direct Links after the config is loaded
|
||||
utils.wait(() => Config.config !== null, 1000, 1).then(() => videoIDChange(getYouTubeVideoID(document.URL)));
|
||||
@@ -81,10 +84,10 @@ utils.wait(() => Config.config !== null, 1000, 1).then(() => videoIDChange(getYo
|
||||
//this only happens if there is an error
|
||||
let sponsorLookupRetries = 0;
|
||||
|
||||
//if showing the start sponsor button or the end sponsor button on the player
|
||||
let showingStartSponsor = true;
|
||||
/** Currently timed segment, which will be added to the unsubmitted segments when ready. */
|
||||
let currentlyTimedSegment: IncompleteSponsorTime | null = null;
|
||||
|
||||
//the sponsor times being prepared to be submitted
|
||||
/** Segments created by the user which have not yet been submitted. */
|
||||
let sponsorTimesSubmitting: SponsorTime[] = [];
|
||||
|
||||
//becomes true when isInfoFound is called
|
||||
@@ -111,12 +114,15 @@ const skipNoticeContentContainer: ContentContainer = () => ({
|
||||
onMobileYouTube,
|
||||
sponsorSubmissionNotice: submissionNotice,
|
||||
resetSponsorSubmissionNotice,
|
||||
changeStartSponsorButton,
|
||||
updateEditButtonsOnPlayer,
|
||||
previewTime,
|
||||
videoInfo,
|
||||
getRealCurrentTime: getRealCurrentTime
|
||||
});
|
||||
|
||||
// value determining when to count segment as skipped and send telemetry to server (percent based)
|
||||
const manualSkipPercentCount = 0.5;
|
||||
|
||||
//get messages from the background script and the popup
|
||||
chrome.runtime.onMessage.addListener(messageListener);
|
||||
|
||||
@@ -127,11 +133,11 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
videoIDChange(getYouTubeVideoID(document.URL));
|
||||
break;
|
||||
case "sponsorStart":
|
||||
sponsorMessageStarted(sendResponse);
|
||||
startOrEndTimingNewSegment()
|
||||
|
||||
break;
|
||||
case "sponsorDataChanged":
|
||||
updateSponsorTimesSubmitting();
|
||||
sendResponse({
|
||||
creatingSegment: currentlyTimedSegment !== null,
|
||||
});
|
||||
|
||||
break;
|
||||
case "isInfoFound":
|
||||
@@ -150,7 +156,8 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
break;
|
||||
case "getVideoID":
|
||||
sendResponse({
|
||||
videoID: sponsorVideoID
|
||||
videoID: sponsorVideoID,
|
||||
creatingSegment: currentlyTimedSegment !== null,
|
||||
});
|
||||
|
||||
break;
|
||||
@@ -170,10 +177,6 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
channelWhitelisted = request.value;
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
|
||||
break;
|
||||
case "changeStartSponsorButton":
|
||||
changeStartSponsorButton(request.showStartSponsor, request.uploadButtonVisible);
|
||||
|
||||
break;
|
||||
case "submitTimes":
|
||||
submitSponsorTimes();
|
||||
@@ -250,25 +253,25 @@ async function videoIDChange(id) {
|
||||
// Wait for options to be ready
|
||||
await utils.wait(() => Config.config !== null, 5000, 1);
|
||||
|
||||
// Get new video info
|
||||
getVideoInfo();
|
||||
|
||||
// If enabled, it will check if this video is private or unlisted and double check with the user if the sponsors should be looked up
|
||||
if (Config.config.checkForUnlistedVideos) {
|
||||
try {
|
||||
await utils.wait(() => !!videoInfo, 5000, 1);
|
||||
} catch (err) {
|
||||
alert(chrome.i18n.getMessage("adblockerIssue") + "\n\n" + chrome.i18n.getMessage("adblockerIssueUnlistedVideosInfo"));
|
||||
}
|
||||
|
||||
if (isUnlisted()) {
|
||||
const shouldContinue = confirm(chrome.i18n.getMessage("confirmPrivacy"));
|
||||
if(!shouldContinue) return;
|
||||
const shouldContinue = confirm("SponsorBlock: You have the setting 'Ignore Unlisted/Private Videos' enabled."
|
||||
+ " Due to a change in how segment fetching works, this setting is not needed anymore as it cannot leak your video ID to the server."
|
||||
+ " It instead sends just the first 4 characters of a longer hash of the videoID to the server, and filters through a subset of the database."
|
||||
+ " More info about this implementation can be found here: https://github.com/ajayyy/SponsorBlockServer/issues/25"
|
||||
+ "\n\nPlease click okay to confirm that you acknowledge this and continue using SponsorBlock.");
|
||||
if (shouldContinue) {
|
||||
Config.config.checkForUnlistedVideos = false;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Get new video info
|
||||
getVideoInfo();
|
||||
|
||||
// Update whitelist data when the video data is loaded
|
||||
utils.wait(() => !!videoInfo, 5000, 10).then(whitelistCheck);
|
||||
whitelistCheck();
|
||||
|
||||
//setup the preview bar
|
||||
if (previewBar === null) {
|
||||
@@ -294,33 +297,21 @@ async function videoIDChange(id) {
|
||||
|
||||
//close popup
|
||||
closeInfoMenu();
|
||||
|
||||
|
||||
sponsorsLookup(id);
|
||||
|
||||
//make sure everything is properly added
|
||||
updateVisibilityOfPlayerControlsButton().then(() => {
|
||||
//see if the onvideo control image needs to be changed
|
||||
const segments = Config.config.segmentTimes.get(sponsorVideoID);
|
||||
if (segments != null && segments.length > 0 && segments[segments.length - 1].segment.length >= 2) {
|
||||
changeStartSponsorButton(true, true);
|
||||
} else if (segments != null && segments.length > 0 && segments[segments.length - 1].segment.length < 2) {
|
||||
changeStartSponsorButton(false, true);
|
||||
} else {
|
||||
changeStartSponsorButton(true, false);
|
||||
}
|
||||
});
|
||||
// Make sure all player buttons are properly added
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
|
||||
//reset sponsor times submitting
|
||||
// Clear unsubmitted segments from the previous video
|
||||
sponsorTimesSubmitting = [];
|
||||
currentlyTimedSegment = null;
|
||||
updateSponsorTimesSubmitting();
|
||||
|
||||
//see if video controls buttons should be added
|
||||
if (!onInvidious) {
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
}
|
||||
}
|
||||
|
||||
function handleMobileControlsMutations(): void {
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
|
||||
if (previewBar !== null) {
|
||||
if (document.body.contains(previewBar.container)) {
|
||||
const progressBarBackground = document.querySelector<HTMLElement>(".progress-bar-background");
|
||||
@@ -573,33 +564,22 @@ async function sponsorsLookup(id: string) {
|
||||
}
|
||||
|
||||
// Check for hashPrefix setting
|
||||
let getRequest;
|
||||
if (Config.config.hashPrefix) {
|
||||
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
|
||||
getRequest = utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
|
||||
categories
|
||||
});
|
||||
} else {
|
||||
getRequest = utils.asyncRequestToServer('GET', "/api/skipSegments", {
|
||||
videoID: id,
|
||||
categories
|
||||
});
|
||||
}
|
||||
getRequest.then(async (response: FetchResponse) => {
|
||||
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
|
||||
utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
|
||||
categories
|
||||
}).then(async (response: FetchResponse) => {
|
||||
if (response?.ok) {
|
||||
let result = JSON.parse(response.responseText);
|
||||
if (Config.config.hashPrefix) {
|
||||
result = result.filter((video) => video.videoID === id);
|
||||
if (result.length > 0) {
|
||||
result = result[0].segments;
|
||||
if (result.length === 0) { // return if no segments found
|
||||
retryFetch(id);
|
||||
return;
|
||||
}
|
||||
} else { // return if no video found
|
||||
result = result.filter((video) => video.videoID === id);
|
||||
if (result.length > 0) {
|
||||
result = result[0].segments;
|
||||
if (result.length === 0) { // return if no segments found
|
||||
retryFetch(id);
|
||||
return;
|
||||
}
|
||||
} else { // return if no video found
|
||||
retryFetch(id);
|
||||
return;
|
||||
}
|
||||
|
||||
const recievedSegments: SponsorTime[] = result;
|
||||
@@ -727,6 +707,21 @@ async function getVideoInfo(): Promise<void> {
|
||||
}
|
||||
}
|
||||
|
||||
async function videoInfoFetchFailed(errorMessage: string): Promise<void> {
|
||||
console.log("failed\t" + errorMessage)
|
||||
if (utils.isFirefox() && !Config.config.ytInfoPermissionGranted) {
|
||||
// Attempt to ask permission for youtube.com domain
|
||||
alert(chrome.i18n.getMessage("youtubePermissionRequest"));
|
||||
|
||||
chrome.runtime.sendMessage({
|
||||
message: "openPage",
|
||||
url: "permissions/index.html#youtube.com"
|
||||
});
|
||||
} else {
|
||||
alert(chrome.i18n.getMessage("videoInfoFetchFailed") + "\n\n" + chrome.i18n.getMessage(errorMessage));
|
||||
}
|
||||
}
|
||||
|
||||
function getYouTubeVideoID(url: string) {
|
||||
// For YouTube TV support
|
||||
if(url.startsWith("https://www.youtube.com/tv#/")) url = url.replace("#", "");
|
||||
@@ -823,8 +818,31 @@ function updatePreviewBar(): void {
|
||||
}
|
||||
|
||||
//checks if this channel is whitelisted, should be done only after the channelID has been loaded
|
||||
function whitelistCheck() {
|
||||
channelID = videoInfo?.videoDetails?.channelId;
|
||||
async function whitelistCheck() {
|
||||
const whitelistedChannels = Config.config.whitelistedChannels;
|
||||
|
||||
const getChannelID = () => videoInfo?.videoDetails?.channelId
|
||||
?? document.querySelector(".ytd-channel-name a")?.getAttribute("href")?.replace(/\/.+\//, "") // YouTube
|
||||
?? document.querySelector(".ytp-title-channel-logo")?.getAttribute("href")?.replace(/https:\/.+\//, "") // YouTube Embed
|
||||
?? document.querySelector("a > .channel-profile")?.parentElement?.getAttribute("href")?.replace(/\/.+\//, ""); // Invidious
|
||||
|
||||
try {
|
||||
await utils.wait(() => !!getChannelID(), 6000, 20);
|
||||
} catch {
|
||||
if (Config.config.forceChannelCheck) {
|
||||
// treat as not whitelisted
|
||||
channelID = "";
|
||||
|
||||
// Don't warn for Invidious embeds
|
||||
if (!(onInvidious && document.URL.includes("/embed/"))) {
|
||||
videoInfoFetchFailed("adblockerIssueWhitelist");
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
channelID = getChannelID();
|
||||
if (!channelID) {
|
||||
channelID = null;
|
||||
|
||||
@@ -832,8 +850,6 @@ function whitelistCheck() {
|
||||
}
|
||||
|
||||
//see if this is a whitelisted channel
|
||||
const whitelistedChannels = Config.config.whitelistedChannels;
|
||||
|
||||
if (whitelistedChannels != undefined && whitelistedChannels.includes(channelID)) {
|
||||
channelWhitelisted = true;
|
||||
}
|
||||
@@ -963,6 +979,26 @@ function previewTime(time: number, unpause = true) {
|
||||
}
|
||||
}
|
||||
|
||||
//send telemetry and count skip
|
||||
function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped: number, fullSkip: boolean) {
|
||||
if (!Config.config.trackViewCount) return;
|
||||
|
||||
let counted = false;
|
||||
for (const segment of skippingSegments) {
|
||||
const index = sponsorTimes.indexOf(segment);
|
||||
if (index !== -1 && !sponsorSkipped[index]) {
|
||||
sponsorSkipped[index] = true;
|
||||
if (!counted) {
|
||||
Config.config.minutesSaved = Config.config.minutesSaved + secondsSkipped / 60;
|
||||
Config.config.skipCount = Config.config.skipCount + 1;
|
||||
counted = true;
|
||||
}
|
||||
|
||||
if (fullSkip) utils.asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//skip from the start time to the end time for a certain index sponsor time
|
||||
function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: SponsorTime[], openNotice: boolean) {
|
||||
// There will only be one submission if it is manual skip
|
||||
@@ -986,29 +1022,7 @@ function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: S
|
||||
}
|
||||
|
||||
//send telemetry that a this sponsor was skipped
|
||||
if (Config.config.trackViewCount && autoSkip) {
|
||||
let alreadySkipped = false;
|
||||
let isPreviewSegment = false;
|
||||
|
||||
for (const segment of skippingSegments) {
|
||||
const index = sponsorTimes.indexOf(segment);
|
||||
if (index !== -1 && !sponsorSkipped[index]) {
|
||||
utils.asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID);
|
||||
|
||||
sponsorSkipped[index] = true;
|
||||
} else if (sponsorSkipped[index]) {
|
||||
alreadySkipped = true;
|
||||
}
|
||||
|
||||
if (index === -1) isPreviewSegment = true;
|
||||
}
|
||||
|
||||
// Count this as a skip
|
||||
if (!alreadySkipped && !isPreviewSegment) {
|
||||
Config.config.minutesSaved = Config.config.minutesSaved + (skipTime[1] - skipTime[0]) / 60;
|
||||
Config.config.skipCount = Config.config.skipCount + 1;
|
||||
}
|
||||
}
|
||||
if (autoSkip) sendTelemetryAndCount(skippingSegments, skipTime[1] - skipTime[0], true);
|
||||
}
|
||||
|
||||
function unskipSponsorTime(segment: SponsorTime) {
|
||||
@@ -1019,13 +1033,18 @@ function unskipSponsorTime(segment: SponsorTime) {
|
||||
}
|
||||
|
||||
function reskipSponsorTime(segment: SponsorTime) {
|
||||
const skippedTime = Math.max(segment.segment[1] - video.currentTime, 0);
|
||||
const segmentDuration = segment.segment[1] - segment.segment[0];
|
||||
const fullSkip = skippedTime / segmentDuration > manualSkipPercentCount;
|
||||
|
||||
video.currentTime = segment.segment[1];
|
||||
|
||||
sendTelemetryAndCount([segment], skippedTime, fullSkip);
|
||||
startSponsorSchedule(true, segment.segment[1], false);
|
||||
}
|
||||
|
||||
function createButton(baseID, title, callback, imageName, isDraggable=false): boolean {
|
||||
if (document.getElementById(baseID + "Button") != null) return false;
|
||||
function createButton(baseID: string, title: string, callback: () => void, imageName: string, isDraggable = false): HTMLElement {
|
||||
const existingElement = document.getElementById(baseID + "Button");
|
||||
if (existingElement !== null) return existingElement;
|
||||
|
||||
// Button HTML
|
||||
const newButton = document.createElement("button");
|
||||
@@ -1049,9 +1068,15 @@ function createButton(baseID, title, callback, imageName, isDraggable=false): bo
|
||||
newButton.appendChild(newButtonImage);
|
||||
|
||||
// Add the button to player
|
||||
controls.prepend(newButton);
|
||||
if (controls) controls.prepend(newButton);
|
||||
|
||||
return true;
|
||||
// Store the elements to prevent unnecessary querying
|
||||
playerButtons[baseID] = {
|
||||
button: newButton,
|
||||
image: newButtonImage,
|
||||
};
|
||||
|
||||
return newButton;
|
||||
}
|
||||
|
||||
function getControls(): HTMLElement | false {
|
||||
@@ -1061,8 +1086,8 @@ function getControls(): HTMLElement | false {
|
||||
// Mobile YouTube
|
||||
".player-controls-top",
|
||||
// Invidious/videojs video element's controls element
|
||||
".vjs-control-bar"
|
||||
]
|
||||
".vjs-control-bar",
|
||||
];
|
||||
|
||||
for (const controlsSelector of controlsSelectors) {
|
||||
const controls = document.querySelectorAll(controlsSelector);
|
||||
@@ -1075,53 +1100,75 @@ function getControls(): HTMLElement | false {
|
||||
return false;
|
||||
}
|
||||
|
||||
//adds all the player controls buttons
|
||||
async function createButtons(): Promise<boolean> {
|
||||
/** Creates any missing buttons on the YouTube player if possible. */
|
||||
async function createButtons(): Promise<void> {
|
||||
if (onMobileYouTube) return;
|
||||
|
||||
const result = await utils.wait(getControls).catch();
|
||||
|
||||
//set global controls variable
|
||||
controls = result;
|
||||
|
||||
let createdButton = false;
|
||||
controls = await utils.wait(getControls).catch();
|
||||
|
||||
// Add button if does not already exist in html
|
||||
createdButton = createButton("startSponsor", "sponsorStart", startSponsorClicked, "PlayerStartIconSponsorBlocker256px.png") || createdButton;
|
||||
createdButton = createButton("info", "openPopup", openInfoMenu, "PlayerInfoIconSponsorBlocker256px.png") || createdButton;
|
||||
createdButton = createButton("delete", "clearTimes", clearSponsorTimes, "PlayerDeleteIconSponsorBlocker256px.png") || createdButton;
|
||||
createdButton = createButton("submit", "SubmitTimes", submitSponsorTimes, "PlayerUploadIconSponsorBlocker256px.png") || createdButton;
|
||||
|
||||
return createdButton;
|
||||
createButton("startSponsor", "sponsorStart", () => closeInfoMenuAnd(() => startOrEndTimingNewSegment()), "PlayerStartIconSponsorBlocker256px.png");
|
||||
createButton("cancelSponsor", "sponsorCancel", () => closeInfoMenuAnd(() => cancelCreatingSegment()), "PlayerUploadFailedIconSponsorBlocker256px.png");
|
||||
createButton("info", "openPopup", openInfoMenu, "PlayerInfoIconSponsorBlocker256px.png");
|
||||
createButton("delete", "clearTimes", () => closeInfoMenuAnd(() => clearSponsorTimes()), "PlayerDeleteIconSponsorBlocker256px.png");
|
||||
createButton("submit", "SubmitTimes", submitSponsorTimes, "PlayerUploadIconSponsorBlocker256px.png");
|
||||
}
|
||||
|
||||
//adds or removes the player controls button to what it should be
|
||||
async function updateVisibilityOfPlayerControlsButton(): Promise<boolean> {
|
||||
//not on a proper video yet
|
||||
if (!sponsorVideoID) return false;
|
||||
/** Creates any missing buttons on the player and updates their visiblity. */
|
||||
async function updateVisibilityOfPlayerControlsButton(): Promise<void> {
|
||||
// Not on a proper video yet
|
||||
if (!sponsorVideoID) return;
|
||||
|
||||
const createdButtons = await createButtons();
|
||||
if (!createdButtons) return;
|
||||
await createButtons();
|
||||
|
||||
if (Config.config.hideVideoPlayerControls || onInvidious) {
|
||||
document.getElementById("startSponsorButton").style.display = "none";
|
||||
document.getElementById("submitButton").style.display = "none";
|
||||
} else {
|
||||
document.getElementById("startSponsorButton").style.removeProperty("display");
|
||||
}
|
||||
updateEditButtonsOnPlayer();
|
||||
|
||||
//don't show the info button on embeds
|
||||
// Don't show the info button on embeds
|
||||
if (Config.config.hideInfoButtonPlayerControls || document.URL.includes("/embed/") || onInvidious) {
|
||||
document.getElementById("infoButton").style.display = "none";
|
||||
playerButtons.info.button.style.display = "none";
|
||||
} else {
|
||||
document.getElementById("infoButton").style.removeProperty("display");
|
||||
playerButtons.info.button.style.removeProperty("display");
|
||||
}
|
||||
|
||||
if (Config.config.hideDeleteButtonPlayerControls || onInvidious) {
|
||||
document.getElementById("deleteButton").style.display = "none";
|
||||
}
|
||||
|
||||
/** Updates the visibility of buttons on the player related to creating segments. */
|
||||
function updateEditButtonsOnPlayer(): void {
|
||||
// Don't try to update the buttons if we aren't on a YouTube video page
|
||||
if (!sponsorVideoID) return;
|
||||
|
||||
const buttonsEnabled = !Config.config.hideVideoPlayerControls && !onInvidious;
|
||||
|
||||
let creatingSegment = false;
|
||||
let submitButtonVisible = false;
|
||||
let deleteButtonVisible = false;
|
||||
|
||||
// Only check if buttons should be visible if they're enabled
|
||||
if (buttonsEnabled) {
|
||||
creatingSegment = currentlyTimedSegment !== null;
|
||||
|
||||
// Show only if there are any segments to submit
|
||||
submitButtonVisible = sponsorTimesSubmitting.length > 0;
|
||||
|
||||
// Show only if there are any segments to delete
|
||||
deleteButtonVisible = sponsorTimesSubmitting.length > 0;
|
||||
}
|
||||
|
||||
return createdButtons;
|
||||
// Update the elements
|
||||
playerButtons.startSponsor.button.style.display = buttonsEnabled ? "unset" : "none";
|
||||
playerButtons.cancelSponsor.button.style.display = buttonsEnabled && creatingSegment ? "unset" : "none";
|
||||
|
||||
if (buttonsEnabled) {
|
||||
if (creatingSegment) {
|
||||
playerButtons.startSponsor.image.src = chrome.extension.getURL("icons/PlayerStopIconSponsorBlocker256px.png");
|
||||
playerButtons.startSponsor.button.setAttribute("title", chrome.i18n.getMessage("sponsorEnd"));
|
||||
} else {
|
||||
playerButtons.startSponsor.image.src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png");
|
||||
playerButtons.startSponsor.button.setAttribute("title", chrome.i18n.getMessage("sponsorStart"));
|
||||
}
|
||||
}
|
||||
|
||||
playerButtons.submit.button.style.display = submitButtonVisible && !Config.config.hideUploadButtonPlayerControls ? "unset" : "none";
|
||||
playerButtons.delete.button.style.display = deleteButtonVisible && !Config.config.hideDeleteButtonPlayerControls ? "unset" : "none";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1142,30 +1189,40 @@ function getRealCurrentTime(): number {
|
||||
}
|
||||
}
|
||||
|
||||
function startSponsorClicked() {
|
||||
//it can't update to this info yet
|
||||
closeInfoMenu();
|
||||
|
||||
toggleStartSponsorButton();
|
||||
|
||||
//add to sponsorTimes
|
||||
if (sponsorTimesSubmitting.length > 0 && sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.length < 2) {
|
||||
//it is an end time
|
||||
sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment[1] = getRealCurrentTime();
|
||||
sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.sort((a, b) => a > b ? 1 : (a < b ? -1 : 0));
|
||||
} else {
|
||||
//it is a start time
|
||||
sponsorTimesSubmitting.push({
|
||||
function startOrEndTimingNewSegment() {
|
||||
if (!currentlyTimedSegment) {
|
||||
// Start a new segment
|
||||
currentlyTimedSegment = {
|
||||
segment: [getRealCurrentTime()],
|
||||
UUID: null,
|
||||
category: Config.config.defaultCategory
|
||||
category: Config.config.defaultCategory,
|
||||
};
|
||||
} else {
|
||||
// Finish creating the new segment
|
||||
const existingTime = currentlyTimedSegment.segment[0];
|
||||
const currentTime = getRealCurrentTime();
|
||||
|
||||
sponsorTimesSubmitting.push({
|
||||
...currentlyTimedSegment,
|
||||
// Swap timestamps if the user put the segment end before the start
|
||||
segment: [Math.min(existingTime, currentTime), Math.max(existingTime, currentTime)],
|
||||
});
|
||||
|
||||
currentlyTimedSegment = null;
|
||||
|
||||
// Save the newly created segment
|
||||
Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
|
||||
}
|
||||
|
||||
//save this info
|
||||
Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
|
||||
updateEditButtonsOnPlayer();
|
||||
|
||||
updateSponsorTimesSubmitting(false)
|
||||
updateSponsorTimesSubmitting(false);
|
||||
}
|
||||
|
||||
function cancelCreatingSegment() {
|
||||
currentlyTimedSegment = null;
|
||||
|
||||
updateEditButtonsOnPlayer();
|
||||
}
|
||||
|
||||
function updateSponsorTimesSubmitting(getFromConfig = true) {
|
||||
@@ -1194,38 +1251,6 @@ function updateSponsorTimesSubmitting(getFromConfig = true) {
|
||||
}
|
||||
}
|
||||
|
||||
async function changeStartSponsorButton(showStartSponsor: boolean, uploadButtonVisible: boolean): Promise<boolean> {
|
||||
if(!sponsorVideoID || onMobileYouTube) return false;
|
||||
|
||||
//if it isn't visible, there is no data
|
||||
const shouldHide = (uploadButtonVisible && !(Config.config.hideDeleteButtonPlayerControls || onInvidious)) ? "unset" : "none"
|
||||
document.getElementById("deleteButton").style.display = shouldHide;
|
||||
|
||||
if (showStartSponsor) {
|
||||
showingStartSponsor = true;
|
||||
(<HTMLImageElement> document.getElementById("startSponsorImage")).src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png");
|
||||
document.getElementById("startSponsorButton").setAttribute("title", chrome.i18n.getMessage("sponsorStart"));
|
||||
|
||||
if (document.getElementById("startSponsorImage").style.display != "none" && uploadButtonVisible && !Config.config.hideUploadButtonPlayerControls && !onInvidious) {
|
||||
document.getElementById("submitButton").style.display = "unset";
|
||||
} else if (!uploadButtonVisible || onInvidious) {
|
||||
//disable submit button
|
||||
document.getElementById("submitButton").style.display = "none";
|
||||
}
|
||||
} else {
|
||||
showingStartSponsor = false;
|
||||
(<HTMLImageElement> document.getElementById("startSponsorImage")).src = chrome.extension.getURL("icons/PlayerStopIconSponsorBlocker256px.png");
|
||||
document.getElementById("startSponsorButton").setAttribute("title", chrome.i18n.getMessage("sponsorEND"));
|
||||
|
||||
//disable submit button
|
||||
document.getElementById("submitButton").style.display = "none";
|
||||
}
|
||||
}
|
||||
|
||||
function toggleStartSponsorButton() {
|
||||
changeStartSponsorButton(!showingStartSponsor, true);
|
||||
}
|
||||
|
||||
function openInfoMenu() {
|
||||
if (document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||
//it's already added
|
||||
@@ -1235,7 +1260,7 @@ function openInfoMenu() {
|
||||
popupInitialised = false;
|
||||
|
||||
//hide info button
|
||||
document.getElementById("infoButton").style.display = "none";
|
||||
if (playerButtons.info) playerButtons.info.button.style.display = "none";
|
||||
|
||||
sendRequestToCustomServer('GET', chrome.extension.getURL("popup.html"), function(xmlhttp) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
@@ -1297,20 +1322,28 @@ function openInfoMenu() {
|
||||
|
||||
function closeInfoMenu() {
|
||||
const popup = document.getElementById("sponsorBlockPopupContainer");
|
||||
if (popup != null) {
|
||||
popup.remove();
|
||||
if (popup === null) return;
|
||||
|
||||
//show info button if it's not an embed
|
||||
if (!document.URL.includes("/embed/")) {
|
||||
document.getElementById("infoButton").style.display = "unset";
|
||||
}
|
||||
popup.remove();
|
||||
|
||||
// Show info button if it's not an embed
|
||||
if (!document.URL.includes("/embed/") && playerButtons.info) {
|
||||
playerButtons.info.button.style.display = "unset";
|
||||
}
|
||||
}
|
||||
|
||||
function clearSponsorTimes() {
|
||||
//it can't update to this info yet
|
||||
/**
|
||||
* The content script currently has no way to notify the info menu of changes. As a workaround we close it, thus making it query the new information when reopened.
|
||||
*
|
||||
* This function and all its uses should be removed when this issue is fixed.
|
||||
* */
|
||||
function closeInfoMenuAnd<T>(func: () => T): T {
|
||||
closeInfoMenu();
|
||||
|
||||
return func();
|
||||
}
|
||||
|
||||
function clearSponsorTimes() {
|
||||
const currentVideoID = sponsorVideoID;
|
||||
|
||||
const sponsorTimes = Config.config.segmentTimes.get(currentVideoID);
|
||||
@@ -1328,8 +1361,7 @@ function clearSponsorTimes() {
|
||||
|
||||
updatePreviewBar();
|
||||
|
||||
//set buttons to be correct
|
||||
changeStartSponsorButton(true, false);
|
||||
updateEditButtonsOnPlayer();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1395,18 +1427,6 @@ function dontShowNoticeAgain() {
|
||||
closeAllSkipNotices();
|
||||
}
|
||||
|
||||
function sponsorMessageStarted(callback: (response: MessageResponse) => void) {
|
||||
video = document.querySelector('video');
|
||||
|
||||
//send back current time
|
||||
callback({
|
||||
time: video.currentTime
|
||||
})
|
||||
|
||||
//update button
|
||||
toggleStartSponsorButton();
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method for the submission notice to clear itself when it closes
|
||||
*/
|
||||
@@ -1417,9 +1437,6 @@ function resetSponsorSubmissionNotice() {
|
||||
function submitSponsorTimes() {
|
||||
if (submissionNotice !== null) return;
|
||||
|
||||
//it can't update to this info yet
|
||||
closeInfoMenu();
|
||||
|
||||
if (sponsorTimesSubmitting !== undefined && sponsorTimesSubmitting.length > 0) {
|
||||
submissionNotice = new SubmissionNotice(skipNoticeContentContainer, sendSubmitMessage);
|
||||
}
|
||||
@@ -1428,10 +1445,10 @@ function submitSponsorTimes() {
|
||||
|
||||
//send the message to the background js
|
||||
//called after all the checks have been made that it's okay to do so
|
||||
async function sendSubmitMessage(): Promise<void> {
|
||||
//add loading animation
|
||||
(<HTMLImageElement> document.getElementById("submitImage")).src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker256px.png");
|
||||
document.getElementById("submitButton").style.animation = "rotate 1s 0s infinite";
|
||||
async function sendSubmitMessage() {
|
||||
// Add loading animation
|
||||
playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker256px.png");
|
||||
playerButtons.submit.button.style.animation = "rotate 1s 0s infinite";
|
||||
|
||||
//check if a sponsor exceeds the duration of the video
|
||||
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
|
||||
@@ -1458,17 +1475,19 @@ async function sendSubmitMessage(): Promise<void> {
|
||||
const response = await utils.asyncRequestToServer("POST", "/api/skipSegments", {
|
||||
videoID: sponsorVideoID,
|
||||
userID: Config.config.userID,
|
||||
segments: sponsorTimesSubmitting
|
||||
segments: sponsorTimesSubmitting,
|
||||
});
|
||||
|
||||
if (response.status === 200) {
|
||||
//hide loading message
|
||||
const submitButton = document.getElementById("submitButton");
|
||||
// Handle submission success
|
||||
const submitButton = playerButtons.submit.button;
|
||||
|
||||
// Make the animation finite
|
||||
submitButton.style.animation = "rotate 1s";
|
||||
//finish this animation
|
||||
//when the animation is over, hide the button
|
||||
const animationEndListener = function() {
|
||||
changeStartSponsorButton(true, false);
|
||||
|
||||
// When the animation is over, hide the button
|
||||
const animationEndListener = () => {
|
||||
updateEditButtonsOnPlayer();
|
||||
|
||||
submitButton.style.animation = "none";
|
||||
|
||||
@@ -1477,13 +1496,12 @@ async function sendSubmitMessage(): Promise<void> {
|
||||
|
||||
submitButton.addEventListener("animationend", animationEndListener);
|
||||
|
||||
//clear the sponsor times
|
||||
// Remove segments from storage since they've already been submitted
|
||||
Config.config.segmentTimes.delete(sponsorVideoID);
|
||||
|
||||
//add submissions to current sponsors list
|
||||
if (sponsorTimes === null) sponsorTimes = [];
|
||||
|
||||
sponsorTimes = sponsorTimes.concat(sponsorTimesSubmitting);
|
||||
// Add submissions to current sponsors list
|
||||
// FIXME: segments from sponsorTimesSubmitting do not contain UUIDs .-.
|
||||
sponsorTimes = (sponsorTimes || []).concat(sponsorTimesSubmitting);
|
||||
|
||||
// Increase contribution count
|
||||
Config.config.sponsorTimesContributed = Config.config.sponsorTimesContributed + sponsorTimesSubmitting.length;
|
||||
@@ -1493,13 +1511,14 @@ async function sendSubmitMessage(): Promise<void> {
|
||||
Config.config.submissionCountSinceCategories = Config.config.submissionCountSinceCategories + 1;
|
||||
|
||||
// Empty the submitting times
|
||||
currentlyTimedSegment = null;
|
||||
sponsorTimesSubmitting = [];
|
||||
|
||||
updatePreviewBar();
|
||||
} else {
|
||||
//show that the upload failed
|
||||
document.getElementById("submitButton").style.animation = "unset";
|
||||
(<HTMLImageElement> document.getElementById("submitImage")).src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png");
|
||||
// Show that the upload failed
|
||||
playerButtons.submit.button.style.animation = "unset";
|
||||
playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png");
|
||||
|
||||
alert(utils.getErrorMessage(response.status, response.responseText));
|
||||
}
|
||||
@@ -1530,8 +1549,9 @@ function getSegmentsMessage(sponsorTimes: SponsorTime[]): string {
|
||||
function addHotkeyListener(): boolean {
|
||||
let videoRoot = document.getElementById("movie_player") as HTMLDivElement;
|
||||
if (onInvidious) videoRoot = (document.getElementById("player-container") ?? document.getElementById("player")) as HTMLDivElement;
|
||||
if (video.baseURI.startsWith("https://www.youtube.com/tv#/")) videoRoot = document.querySelector("ytlr-watch-page") as HTMLDivElement;
|
||||
|
||||
if (!videoRootsWithEventListeners.includes(videoRoot)) {
|
||||
if (videoRoot && !videoRootsWithEventListeners.includes(videoRoot)) {
|
||||
videoRoot.addEventListener("keydown", hotkeyListener);
|
||||
videoRootsWithEventListeners.push(videoRoot);
|
||||
return true;
|
||||
@@ -1555,7 +1575,7 @@ function hotkeyListener(e: KeyboardEvent): void {
|
||||
}
|
||||
break;
|
||||
case startSponsorKey:
|
||||
startSponsorClicked();
|
||||
startOrEndTimingNewSegment();
|
||||
break;
|
||||
case submitKey:
|
||||
submitSponsorTimes();
|
||||
@@ -1563,14 +1583,6 @@ function hotkeyListener(e: KeyboardEvent): void {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this an unlisted YouTube video.
|
||||
* Assumes that the the privacy info is available.
|
||||
*/
|
||||
function isUnlisted(): boolean {
|
||||
return videoInfo?.microformat?.playerMicroformatRenderer?.isUnlisted || videoInfo?.videoDetails?.isPrivate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the CSS to the page if needed. Required on optional sites with Chrome.
|
||||
*/
|
||||
|
||||
@@ -12,7 +12,6 @@ interface DefaultMessage {
|
||||
message:
|
||||
"update"
|
||||
| "sponsorStart"
|
||||
| "sponsorDataChanged"
|
||||
| "isInfoFound"
|
||||
| "getVideoID"
|
||||
| "getChannelID"
|
||||
@@ -25,13 +24,7 @@ interface BoolValueMessage {
|
||||
value: boolean;
|
||||
}
|
||||
|
||||
interface ChangeStartSponsorButtonMessage {
|
||||
message: "changeStartSponsorButton";
|
||||
showStartSponsor: boolean;
|
||||
uploadButtonVisible: boolean;
|
||||
}
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | ChangeStartSponsorButtonMessage);
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage);
|
||||
|
||||
interface IsInfoFoundMessageResponse {
|
||||
found: boolean;
|
||||
@@ -47,7 +40,7 @@ interface GetChannelIDResponse {
|
||||
}
|
||||
|
||||
interface SponsorStartResponse {
|
||||
time: number;
|
||||
creatingSegment: boolean;
|
||||
}
|
||||
|
||||
interface IsChannelWhitelistedResponse {
|
||||
|
||||
@@ -288,7 +288,7 @@ function invidiousInit(checkbox: HTMLInputElement, option: string) {
|
||||
if (utils.isFirefox()) permissions = [];
|
||||
|
||||
chrome.permissions.contains({
|
||||
origins: utils.getInvidiousInstancesRegex(),
|
||||
origins: utils.getPermissionRegex(),
|
||||
permissions: permissions
|
||||
}, function (result) {
|
||||
if (result != checkbox.checked) {
|
||||
|
||||
35
src/permissions.ts
Normal file
35
src/permissions.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import Config from "./config";
|
||||
import Utils from "./utils";
|
||||
const utils = new Utils();
|
||||
|
||||
// This is needed, if Config is not imported before Utils, things break.
|
||||
// Probably due to cyclic dependencies
|
||||
Config.config;
|
||||
|
||||
window.addEventListener('DOMContentLoaded', init);
|
||||
|
||||
async function init() {
|
||||
utils.localizeHtmlPage();
|
||||
|
||||
const domains = document.location.hash.replace("#", "").split(",");
|
||||
|
||||
const acceptButton = document.getElementById("acceptPermissionButton");
|
||||
acceptButton.addEventListener("click", () => {
|
||||
chrome.permissions.request({
|
||||
origins: utils.getPermissionRegex(domains),
|
||||
permissions: []
|
||||
}, (granted) => {
|
||||
if (granted) {
|
||||
alert(chrome.i18n.getMessage("permissionRequestSuccess"));
|
||||
|
||||
Config.config.ytInfoPermissionGranted = true;
|
||||
|
||||
chrome.tabs.getCurrent((tab) => {
|
||||
chrome.tabs.remove(tab.id);
|
||||
});
|
||||
} else {
|
||||
alert(chrome.i18n.getMessage("permissionRequestFailed"));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
129
src/popup.ts
129
src/popup.ts
@@ -126,8 +126,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.optionsButton.addEventListener("click", openOptions);
|
||||
PageElements.helpButton.addEventListener("click", openHelp);
|
||||
|
||||
//if true, the button now selects the end time
|
||||
let startTimeChosen = false;
|
||||
/** If true, the content script is in the process of creating a new segment. */
|
||||
let creatingSegment = false;
|
||||
|
||||
//the start and end time pairs (2d)
|
||||
let sponsorTimes: SponsorTime[] = [];
|
||||
@@ -233,11 +233,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
|
||||
function onTabs(tabs) {
|
||||
messageHandler.sendMessage(tabs[0].id, {message: 'getVideoID'}, function(result) {
|
||||
if (result != undefined && result.videoID) {
|
||||
if (result !== undefined && result.videoID) {
|
||||
currentVideoID = result.videoID;
|
||||
creatingSegment = result.creatingSegment;
|
||||
|
||||
loadTabData(tabs);
|
||||
} else if (result == undefined && chrome.runtime.lastError) {
|
||||
// this isn't a YouTube video then, or at least the content script is not loaded
|
||||
} else if (result === undefined && chrome.runtime.lastError) {
|
||||
//this isn't a YouTube video then, or at least the content script is not loaded
|
||||
displayNoVideo();
|
||||
}
|
||||
});
|
||||
@@ -253,19 +255,11 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//load video times for this video
|
||||
const sponsorTimesStorage = Config.config.segmentTimes.get(currentVideoID);
|
||||
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
|
||||
if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].segment.length < 2) {
|
||||
startTimeChosen = true;
|
||||
PageElements.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd");
|
||||
}
|
||||
|
||||
sponsorTimes = sponsorTimesStorage;
|
||||
|
||||
//show submission section
|
||||
PageElements.submissionSection.style.display = "unset";
|
||||
|
||||
showSubmitTimesIfNecessary();
|
||||
}
|
||||
|
||||
updateSegmentEditingUI();
|
||||
|
||||
//check if this video's sponsors are known
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
@@ -321,51 +315,44 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//the content script will get the message if a YouTube page is open
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
currentWindow: true,
|
||||
}, (tabs) => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{from: 'popup', message: 'sponsorStart'},
|
||||
startSponsorCallback
|
||||
async (response) => {
|
||||
startSponsorCallback(response);
|
||||
|
||||
// Perform a second update after the config changes take effect as a workaround for a race condition
|
||||
const removeListener = (listener: typeof lateUpdate) => {
|
||||
const index = Config.configListeners.indexOf(listener);
|
||||
if (index !== -1) Config.configListeners.splice(index, 1);
|
||||
};
|
||||
|
||||
const lateUpdate = () => {
|
||||
startSponsorCallback(response);
|
||||
removeListener(lateUpdate);
|
||||
};
|
||||
|
||||
Config.configListeners.push(lateUpdate);
|
||||
|
||||
// Remove the listener after 200ms in case the changes were propagated by the time we got the response
|
||||
setTimeout(() => removeListener(lateUpdate), 200);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function startSponsorCallback(response) {
|
||||
const sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0);
|
||||
function startSponsorCallback(response: {creatingSegment: boolean}) {
|
||||
creatingSegment = response.creatingSegment;
|
||||
|
||||
if (sponsorTimes[sponsorTimesIndex] == undefined) {
|
||||
sponsorTimes[sponsorTimesIndex] = {
|
||||
segment: [],
|
||||
category: Config.config.defaultCategory,
|
||||
UUID: null
|
||||
};
|
||||
// Only update the segments after a segment was created
|
||||
if (!creatingSegment) {
|
||||
sponsorTimes = Config.config.segmentTimes.get(currentVideoID) || [];
|
||||
}
|
||||
|
||||
sponsorTimes[sponsorTimesIndex].segment[startTimeChosen ? 1 : 0] = response.time;
|
||||
|
||||
const localStartTimeChosen = startTimeChosen;
|
||||
Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
|
||||
|
||||
//send a message to the client script
|
||||
if (localStartTimeChosen) {
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{message: "sponsorDataChanged"}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
updateStartTimeChosen();
|
||||
|
||||
//show submission section
|
||||
PageElements.submissionSection.style.display = "unset";
|
||||
|
||||
showSubmitTimesIfNecessary();
|
||||
// Update the UI
|
||||
updateSegmentEditingUI();
|
||||
}
|
||||
|
||||
//display the video times from the array at the top, in a different section
|
||||
@@ -484,34 +471,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.showNoticeAgain.style.display = "none";
|
||||
}
|
||||
|
||||
function updateStartTimeChosen() {
|
||||
//update startTimeChosen letiable
|
||||
if (!startTimeChosen) {
|
||||
startTimeChosen = true;
|
||||
PageElements.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd");
|
||||
} else {
|
||||
resetStartTimeChosen();
|
||||
}
|
||||
/** Updates any UI related to segment editing and submission according to the current state. */
|
||||
function updateSegmentEditingUI() {
|
||||
PageElements.sponsorStart.innerText = chrome.i18n.getMessage(creatingSegment ? "sponsorEnd" : "sponsorStart");
|
||||
|
||||
PageElements.submissionSection.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
||||
}
|
||||
|
||||
//set it to false
|
||||
function resetStartTimeChosen() {
|
||||
startTimeChosen = false;
|
||||
PageElements.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorStart");
|
||||
}
|
||||
|
||||
//hides and shows the submit times button when needed
|
||||
function showSubmitTimesIfNecessary() {
|
||||
//check if an end time has been specified for the latest sponsor time
|
||||
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].segment.length > 1) {
|
||||
//show submit times button
|
||||
document.getElementById("submitTimesContainer").style.display = "flex";
|
||||
} else {
|
||||
//hide submit times button
|
||||
document.getElementById("submitTimesContainer").style.display = "none";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//make the options div visible
|
||||
function openOptions() {
|
||||
chrome.runtime.sendMessage({"message": "openConfig"});
|
||||
@@ -726,10 +692,11 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
* @param {float} seconds
|
||||
* @returns {string}
|
||||
*/
|
||||
function getFormattedHours(minues) {
|
||||
const hours = Math.floor(minues / 60);
|
||||
return (hours > 0 ? hours + "h " : "") + (minues % 60).toFixed(1);
|
||||
}
|
||||
function getFormattedHours(minutes) {
|
||||
minutes = Math.round(minutes * 10) / 10
|
||||
const hours = Math.floor(minutes / 60);
|
||||
return (hours > 0 ? hours + "h " : "") + (minutes % 60).toFixed(1);
|
||||
}
|
||||
|
||||
//end of function
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ export interface ContentContainer {
|
||||
onMobileYouTube: boolean,
|
||||
sponsorSubmissionNotice: SubmissionNotice,
|
||||
resetSponsorSubmissionNotice: () => void,
|
||||
changeStartSponsorButton: (showStartSponsor: boolean, uploadButtonVisible: boolean) => Promise<boolean>,
|
||||
updateEditButtonsOnPlayer: () => void,
|
||||
previewTime: (time: number, unpause?: boolean) => void,
|
||||
videoInfo: VideoInfo,
|
||||
getRealCurrentTime: () => number
|
||||
@@ -60,6 +60,10 @@ export interface SponsorTime {
|
||||
hidden?: SponsorHideType;
|
||||
}
|
||||
|
||||
export type IncompleteSponsorTime = Omit<SponsorTime, 'segment'> & {
|
||||
segment: [number];
|
||||
};
|
||||
|
||||
export interface PreviewBarOption {
|
||||
color: string,
|
||||
opacity: string
|
||||
@@ -160,4 +164,4 @@ export type VideoID = string;
|
||||
|
||||
export type StorageChangesObject = { [key: string]: chrome.storage.StorageChange };
|
||||
|
||||
export type UnEncodedSegmentTimes = [string, SponsorTime[]][];
|
||||
export type UnEncodedSegmentTimes = [string, SponsorTime[]][];
|
||||
|
||||
45
src/utils.ts
45
src/utils.ts
@@ -3,10 +3,10 @@ import { CategorySelection, SponsorTime, FetchResponse, BackgroundScriptContaine
|
||||
|
||||
import * as CompileConfig from "../config.json";
|
||||
|
||||
class Utils {
|
||||
export default class Utils {
|
||||
|
||||
// Contains functions needed from the background script
|
||||
backgroundScriptContainer: BackgroundScriptContainer | null = null;
|
||||
backgroundScriptContainer: BackgroundScriptContainer | null;
|
||||
|
||||
// Used to add content scripts and CSS required
|
||||
js = [
|
||||
@@ -19,12 +19,12 @@ class Utils {
|
||||
"popup.css"
|
||||
];
|
||||
|
||||
constructor(backgroundScriptContainer?: BackgroundScriptContainer) {
|
||||
constructor(backgroundScriptContainer: BackgroundScriptContainer = null) {
|
||||
this.backgroundScriptContainer = backgroundScriptContainer;
|
||||
}
|
||||
|
||||
// Function that can be used to wait for a condition before returning
|
||||
async wait(condition: () => HTMLElement | boolean, timeout = 5000, check = 100): Promise<HTMLElement | boolean> {
|
||||
/** Function that can be used to wait for a condition before returning. */
|
||||
async wait<T>(condition: () => T | false, timeout = 5000, check = 100): Promise<T> {
|
||||
return await new Promise((resolve, reject) => {
|
||||
setTimeout(() => reject("TIMEOUT"), timeout);
|
||||
|
||||
@@ -43,6 +43,12 @@ class Utils {
|
||||
});
|
||||
}
|
||||
|
||||
containsPermission(permissions: chrome.permissions.Permissions): Promise<boolean> {
|
||||
return new Promise((resolve) => {
|
||||
chrome.permissions.contains(permissions, resolve)
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Asks for the optional permissions required for all extra sites.
|
||||
* It also starts the content script registrations.
|
||||
@@ -57,7 +63,7 @@ class Utils {
|
||||
if (this.isFirefox()) permissions = [];
|
||||
|
||||
chrome.permissions.request({
|
||||
origins: this.getInvidiousInstancesRegex(),
|
||||
origins: this.getPermissionRegex(),
|
||||
permissions: permissions
|
||||
}, async (granted) => {
|
||||
if (granted) {
|
||||
@@ -78,7 +84,6 @@ class Utils {
|
||||
* For now, it is just SB.config.invidiousInstances.
|
||||
*/
|
||||
setupExtraSiteContentScripts(): void {
|
||||
|
||||
if (this.isFirefox()) {
|
||||
const firefoxJS = [];
|
||||
for (const file of this.js) {
|
||||
@@ -95,7 +100,7 @@ class Utils {
|
||||
allFrames: true,
|
||||
js: firefoxJS,
|
||||
css: firefoxCSS,
|
||||
matches: this.getInvidiousInstancesRegex()
|
||||
matches: this.getPermissionRegex()
|
||||
};
|
||||
|
||||
if (this.backgroundScriptContainer) {
|
||||
@@ -106,7 +111,7 @@ class Utils {
|
||||
} else {
|
||||
chrome.declarativeContent.onPageChanged.removeRules(["invidious"], () => {
|
||||
const conditions = [];
|
||||
for (const regex of this.getInvidiousInstancesRegex()) {
|
||||
for (const regex of this.getPermissionRegex()) {
|
||||
conditions.push(new chrome.declarativeContent.PageStateMatcher({
|
||||
pageUrl: { urlMatches: regex }
|
||||
}));
|
||||
@@ -149,7 +154,7 @@ class Utils {
|
||||
}
|
||||
|
||||
chrome.permissions.remove({
|
||||
origins: this.getInvidiousInstancesRegex()
|
||||
origins: this.getPermissionRegex()
|
||||
});
|
||||
}
|
||||
|
||||
@@ -250,16 +255,20 @@ class Utils {
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {String[]} Invidious Instances in regex form
|
||||
* @returns {String[]} Domains in regex form
|
||||
*/
|
||||
getInvidiousInstancesRegex(): string[] {
|
||||
const invidiousInstancesRegex: string[] = [];
|
||||
for (const url of Config.config.invidiousInstances) {
|
||||
invidiousInstancesRegex.push("https://*." + url + "/*");
|
||||
invidiousInstancesRegex.push("http://*." + url + "/*");
|
||||
getPermissionRegex(domains: string[] = []): string[] {
|
||||
const permissionRegex: string[] = [];
|
||||
if (domains.length === 0) {
|
||||
domains = [...Config.config.invidiousInstances];
|
||||
}
|
||||
|
||||
return invidiousInstancesRegex;
|
||||
for (const url of domains) {
|
||||
permissionRegex.push("https://*." + url + "/*");
|
||||
permissionRegex.push("http://*." + url + "/*");
|
||||
}
|
||||
|
||||
return permissionRegex;
|
||||
}
|
||||
|
||||
generateUserID(length = 36): string {
|
||||
@@ -434,5 +443,3 @@ class Utils {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default Utils;
|
||||
|
||||
@@ -9,7 +9,8 @@ module.exports = env => ({
|
||||
popup: path.join(__dirname, srcDir + 'popup.ts'),
|
||||
background: path.join(__dirname, srcDir + 'background.ts'),
|
||||
content: path.join(__dirname, srcDir + 'content.ts'),
|
||||
options: path.join(__dirname, srcDir + 'options.ts')
|
||||
options: path.join(__dirname, srcDir + 'options.ts'),
|
||||
permissions: path.join(__dirname, srcDir + 'permissions.ts')
|
||||
},
|
||||
output: {
|
||||
path: path.join(__dirname, '../dist/js'),
|
||||
|
||||
Reference in New Issue
Block a user