mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2026-01-07 09:09:03 +03:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
918adc7c28 | ||
|
|
ab84b9d2e0 | ||
|
|
9e0a9b4601 | ||
|
|
98fd841a54 | ||
|
|
3816313f1e | ||
|
|
a433dad080 | ||
|
|
dc04e045aa | ||
|
|
2f842a0455 | ||
|
|
7c38b1f8f2 | ||
|
|
6942bcb418 | ||
|
|
a335ae2b72 | ||
|
|
52020bcac6 | ||
|
|
5454861c78 | ||
|
|
1217b9ed0b | ||
|
|
e78a1b0fed | ||
|
|
a259949cd6 | ||
|
|
ebf333b8c6 | ||
|
|
9a5cb5ae0f | ||
|
|
20e1a96a84 | ||
|
|
822c7bda89 | ||
|
|
1526fbcbe8 | ||
|
|
b8f4f8bebc | ||
|
|
e3698dcdca | ||
|
|
fc3abc2b56 | ||
|
|
2a8a425627 | ||
|
|
9069f7cee6 | ||
|
|
a217831c22 | ||
|
|
44e8b316a5 |
39
.github/workflows/release.yml
vendored
39
.github/workflows/release.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
- run: mkdir ./builds
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/ChromeExtension.zip ./dist
|
||||
args: zip -qq -r ./builds/ChromeExtension.zip ./dist/*
|
||||
|
||||
# Create Firefox artifacts
|
||||
- name: Create Firefox artifacts
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
path: dist
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/FirefoxExtension.zip ./dist
|
||||
args: zip -qq -r ./builds/FirefoxExtension.zip ./dist/*
|
||||
|
||||
# Create Beta artifacts (Builds with the name changed to beta)
|
||||
- name: Create Chrome Beta artifacts
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
path: dist
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/ChromeExtensionBeta.zip ./dist
|
||||
args: zip -qq -r ./builds/ChromeExtensionBeta.zip ./dist/*
|
||||
|
||||
- name: Create Firefox Beta artifacts
|
||||
run: npm run build:firefox -- --env.stream=beta
|
||||
@@ -60,7 +60,24 @@ jobs:
|
||||
path: dist
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/FirefoxExtensionBeta.zip ./dist
|
||||
args: zip -qq -r ./builds/FirefoxExtensionBeta.zip ./dist/*
|
||||
|
||||
# Create Firefox Signed Beta version
|
||||
- name: Create Firefox Signed Beta artifacts
|
||||
run: npm run web-sign
|
||||
env:
|
||||
WEB_EXT_API_KEY: ${{ secrets.WEB_EXT_API_KEY }}
|
||||
WEB_EXT_API_SECRET: ${{ secrets.WEB_EXT_API_SECRET }}
|
||||
- name: Install rename
|
||||
run: sudo apt-get install rename
|
||||
- name: Install signed file
|
||||
run: cd ./web-ext-artifacts
|
||||
run: rename 's/.*/FirefoxSignedInstaller.xpi/' *
|
||||
run: cd ..
|
||||
- uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: FirefoxExtensionSigned.xpi
|
||||
path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi
|
||||
|
||||
# Upload each release asset
|
||||
- name: Upload to release
|
||||
@@ -70,6 +87,13 @@ jobs:
|
||||
name: ChromeExtension.zip
|
||||
path: ./builds/ChromeExtension.zip
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Upload to release
|
||||
uses: Shopify/upload-to-release@master
|
||||
with:
|
||||
args: builds/ChromeExtensionBeta.zip
|
||||
name: ChromeExtensionBeta.zip
|
||||
path: ./builds/ChromeExtensionBeta.zip
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Upload to release
|
||||
uses: Shopify/upload-to-release@master
|
||||
with:
|
||||
@@ -77,4 +101,11 @@ jobs:
|
||||
name: FirefoxExtension.zip
|
||||
path: ./builds/FirefoxExtension.zip
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Upload to release
|
||||
uses: Shopify/upload-to-release@master
|
||||
with:
|
||||
args: web-ext-artifacts/FirefoxSignedInstaller.xpi
|
||||
name: FirefoxSignedInstaller.xpi
|
||||
path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
@@ -58,6 +58,8 @@ You can read the API docs [here](https://github.com/ajayyy/SponsorBlockServer#ap
|
||||
|
||||
# Building
|
||||
|
||||
Rename `config.json.example` to `config.json` and adjust configuration as desired.
|
||||
|
||||
There are also other build scripts available. Install `npm`, then run `npm install` in the repository to install dependencies.
|
||||
|
||||
Run `npm run build` to generate a Chrome extension.
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
"serverAddress": "https://sponsor.ajay.app",
|
||||
"testingServerAddress": "https://sponsor.ajay.app/test",
|
||||
"serverAddressComment": "This specifies the default SponsorBlock server to conect to",
|
||||
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "offtopic"]
|
||||
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"]
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "__MSG_Name__",
|
||||
"version": "1.2.27",
|
||||
"version": "1.2.28",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"content_scripts": [{
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
},
|
||||
"scripts": {
|
||||
"web-run": "npm run web-run:chrome",
|
||||
"web-sign": "web-ext sign -s dist",
|
||||
"web-run:firefox": "cd dist && web-ext run --start-url https://addons.mozilla.org/firefox/addon/ublock-origin/",
|
||||
"web-run:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium",
|
||||
"build": "npm run build:chrome",
|
||||
|
||||
@@ -1 +1,8 @@
|
||||
{}
|
||||
{
|
||||
"Sponsor": {
|
||||
"message": "sponzor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponzoři"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -351,7 +351,7 @@
|
||||
"message": "Support Invidious"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) is a third party YouTube client. To enable support, you must accept the extra permissions. This does NOT work in incongnito on Chrome and other Chromium variants."
|
||||
"message": "Invidious (invidio.us) is a third party YouTube client. To enable support, you must accept the extra permissions. This does NOT work in incognito on Chrome and other Chromium variants."
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Enable Invidious support, disable autoskip, hide buttons and more."
|
||||
@@ -490,19 +490,22 @@
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Intro"
|
||||
"message": "Intro Animation"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Outro"
|
||||
"message": "Endcards/Credits"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interaction (Redundant Like, Subscribe, Follow, etc.)"
|
||||
"message": "Interaction Reminder (Subscribe)"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Self-Promotion and Merchandise"
|
||||
},
|
||||
"category_offtopic": {
|
||||
"message": "Offtopic tangent (Subjective)"
|
||||
"category_music_offtopic": {
|
||||
"message": "Music: Non-Music Section"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Donation/Message Readings"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Disable"
|
||||
@@ -554,5 +557,14 @@
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Consider Enabling Force Channel Check Before Skipping Sponsors"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Incorrect"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Wrong Category"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "This video is categorized as music. Are you sure you would like to submit segments with non-music categories? Unless this video is not actually music, you should not be submitting this segment. Please read the guidelines if you are confused."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,29 @@
|
||||
{}
|
||||
{
|
||||
"Loading": {
|
||||
"message": "Betöltés..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Sose mutassa"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Szüneteltetve"
|
||||
},
|
||||
"save": {
|
||||
"message": "Mentés"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Visszaállítás"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Mégse"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Törlés"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Előnézet"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Szerkesztés"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,151 @@
|
||||
{}
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "sponzor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponzori"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponzor bol Preskočený"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Nahlásiť"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Načitávanie..."
|
||||
},
|
||||
"Mins": {
|
||||
"message": "Minúty"
|
||||
},
|
||||
"Secs": {
|
||||
"message": "Sekundy"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Nikdy nezobrazovať"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pozastavené"
|
||||
},
|
||||
"here": {
|
||||
"message": "tu"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Skryť Toto"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Nastavenia"
|
||||
},
|
||||
"website": {
|
||||
"message": "Webstránka",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Zdrojový Kód",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Vaša Práca",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Kód chyby: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Preskočiť Sponzor?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Preskočiť"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Zakázať Automatické Preskočenie"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Povoliť Automatické Preskočenie"
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minúta"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "minúty"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "hodina"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "hodiny"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Nastaviť Používateľove ID"
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Vytvoril"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatické Preskočenie"
|
||||
},
|
||||
"add": {
|
||||
"message": "Pridať"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Ukázať Nahrávacie Tlačidlo"
|
||||
},
|
||||
"save": {
|
||||
"message": "Uložiť"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Vynulovať"
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Nastaviť Nastavenia"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Poslať"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Zrušiť"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Odstrániť"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Ukážka"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Upraviť"
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Kľúč"
|
||||
},
|
||||
"to": {
|
||||
"message": "pre",
|
||||
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponzor"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Úvod"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Zakázať"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Manuálne Preskočenie"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Teraz)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Viac Kategórií"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Koniec)"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"message": "ID kanála nie je zatiaľ načítané."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,5 +508,20 @@
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Nu)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Fler Kategorier"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Slut)"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,558 @@
|
||||
{}
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "Youtube için SponsorBlock - Sponsorlukları Atla",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "YouTube videolarındaki sponsorlukları atla. İzlediğin videolardaki sponsorları diğerlerine zaman kazandırmak için raporla.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Sunucu isteğin geçersiz olduğunu iletti"
|
||||
},
|
||||
"429": {
|
||||
"message": "Sadece bu video için çok fazla sponsor süresi belirtti, bu kadar fazla olduğuna emin misin?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Bu daha önce zaten gönderilmiş"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanal beyazlistede!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "sponsor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponsorlar"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "sponsor bölümü"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "sponsor bölümleri"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponsor Geçildi"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Raporla"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Bu sponsor bölümünü hatalı olarak rapor et."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Yoksay"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Yükleniyor..."
|
||||
},
|
||||
"Mins": {
|
||||
"message": "Dakika"
|
||||
},
|
||||
"Secs": {
|
||||
"message": "Saniye"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Asla Gösterme"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Geldiğiniz yere dönmek istiyorsanız atlama'ya basın."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Atlama"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Tekrar atla"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Duraklatıldı"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "Değerleri tek başına düzenlemek ve silmek için, bilgi butonuna basın veya sağ yukarıdaki eklenti simgesine tıklayarak eklenti menüsünü açın."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Bunu silmek istediğinize emin misiniz?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Sponsor sürelerini yollarken bir sorun oluştur, lütfen tekrar deneyin."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Bu videonun sponsorları veritabanında mevcut!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Sponsor bulunamadı"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Sponsorluk Şimdi Başlıyor"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Sponsorluk Şimdi Bitiyor"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Bu sekmede YouTube videosu bulunamadı. Bu sekmenin bir YouTube sekmesi olduğundan eminseniz, bu pencereyi kapatıp, tekrar açın. Eğer o da işe yaramazsa, sekmeyi yenilemeyi deneyin."
|
||||
},
|
||||
"success": {
|
||||
"message": "Başarılı!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Oylandı!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Bu şekilde zaten oy kullanmıştın."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Sunucu çökmüş gibi duruyor. Derhal geliştiriciyle iletişime geçin."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Bağlantı hatası oluştu. Hata kodu: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Bu video için sponsor sürelerini göndermek istiyor musunuz"
|
||||
},
|
||||
"leftTimes": {
|
||||
"message": "Bazı sponsor sürelerini göndermediğinizi görüyoruz. Göndermek için sayfaya geri dönebilirsiniz (hala mevcutlar)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Sponsor Sürelerini Temizle"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "SponsorBlock Penceresini Aç"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Sponsor Sürelerini Gönder"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Bunu göndermek istediğinize emin misiniz?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Kanalı Beyazlisteye Ekle"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Kanalı Beyazlisteden Kaldır"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Sponsor Süresi için Oy Kullan"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Sponsor Süresini Kaydet"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "Şu an kadar yolladığınız"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "İnsanların şu kadar vaktini kurtardınız "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Liderlik tablosunu görüntüle"
|
||||
},
|
||||
"here": {
|
||||
"message": "burada"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Kaydetmek ve veritabanına yollamak için sponsorluk başladığında ve bittiğinde aşağıdaki butona tıklayın."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "İpuçu: Sponsorluk süresinin başını ve sonunu raporlamak için video üzerindeyken noktalı virgül tuşuna, yollamak için tırnak tuşuna basınız. (Bu ayarlardan değiştirilebilir.)"
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Son Sponsor Mesajı Süresi Seçildi"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Süreleri Temizle"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Süreleri Gönder"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Bu, ne kadar katkı sağladığınızı göstermek için herkese açık istatistik sayfasında kullanılacaktır. Görün"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Kullanıcı Adı Belirle"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Öneri ve geri bildirimleriniz için resmi Discord serverımıza katılın!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Bunu sakla"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Ayarlar"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "YouTube oynatıcısında Butonları Göster"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "YouTube Oynatıcısındaki Butonları Gizle"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Bu YouTube oynatıcısındaki bölüm geçişlerini yolladığınız butonları saklayacaktır."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "YouTube Oynatıcısındaki Bilgi Butonunu Göster"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "YouTube Oynatıcısındaki Bilgi Butonunu Gizle"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Bu, YouTube sayfasında açılan pencereyi açan butondur."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "YouTube Oynatıcısında Silme Tuşunu Gizle"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube Oynatıcısında Silme Tuşunu Göster"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Bu, YouTube oynatıcısındaki mevcut video için gönderilmemiş bölümleri temizleyen butondur."
|
||||
},
|
||||
"disableViewTracking": {
|
||||
"message": "Sponsor Atlama Takip Sayacını Devredışı Bırak"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Sponsor Atlama Takip Sayacını Devreye Sok"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Bu özellik, önerinizin diğerlerine ne kadar işe yaradığını bildirmek için atladığınız sponsorları kaydeder ve istenmeyen önerilerin veritabanına girmesini engellemek adına bir ölçü olarak kullanılır. Her sponsor atladığınızda eklenti sunucuya bir mesaj yollar. Umarım bu ayarı birçok kişi değiştirmez ve böylece görüntülenme sayıları doğru kalır. :)"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Uyarıyı Tekrar Göster"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock, YouTube'da sponsorlu bölümleri atlamanıza yardımcı olan bir eklentidir. SponsorBlock, herkesin YouTube videolarında bulunan sponsorlu bölümlerin başını ve sonunu göndermesine izin veren kitlekaynaklı bir tarayıcı eklentisidir. Bu bilgiyi biri yolladığında, bu sponsorlu bölüm herkeste atlanır.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "Website",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Kaynak Kodu",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "Uyarı güncellendi!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Eğer hala beğenmediyseniz, asla gösterme butonuna basın.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Sponsor bölümünün başlangıcı için bir tuş belirleyin"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Gönderim için bir tuş belirleyin"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Yazarak bir tuş seçin"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Tuş seçimi şu tuşa ayarlandı: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Bağlantı zaman aşımına uğradı. İnternet bağlantınızı kontrol ediniz. Eğer internetiniz çalışıyor ise, büyük ihtimalle sunucuya erişilemiyor veya sunucuya aşırı yüklenilmiş olabilir."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "SponsorBlock'u Devredışı Bırak"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "SponsorBlock'u Devreye Sok"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Çalışmalarınız",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Sunucuya aşırı yüklenilmiş gibi gözüküyor. Birazdan tekrar deneyin."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Hata Kodu: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Sponsoru Atla?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Atla"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Otomatik Atlamayı Devredışı Bırak"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Otomatik Atlamayı Devreye Sok"
|
||||
},
|
||||
"autoSkipDescription": {
|
||||
"message": "Otomatik atlama sponsorları sizin için atlayacak. Kapalı olduğunda, atlamak istediğinizi soran bir uyarı ekranı belirecek."
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Atlamada Sesli Bildirim"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Atlamada sesli bildirim, bir sponsor bölümü atlandığında bir ses çalar. Eğer devredışı bırakıldıysa (veya otomatik atlama devredışı bırakıldıysa), herhangi bir ses çalmayacak."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Bunu atladınız "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Şu kadar süre kazandınız "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "dakika"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "dakika"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "saat"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "saat"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "İnsanların"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " kadar vaktini kurtardınız."
|
||||
},
|
||||
"guildlinesSummary": {
|
||||
"message": "- Bölümünüzün sadece ücretli tanıtım bölümü olduğundan emin olun.\n- Bu bölümü atlamanın önemli içerik bölümlerini de atlamayacağından emin olun. \n- Eğer tüm bölüm sponsor ise, lütfen raporlamayın. Tüm video rapor sistemimiz yakında gelecek.\n- Eğer videoda taraflılık içeren bir uyarı var raporlamayın (Eğer bir inceleme videosu sponsorluysa, bundan bahsettikleri kısmı atlatmayın)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Sunucu durumu için status.sponsor.ajay.app kontrol edin."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Kullanıcı kimliğini Dışarı/İçeri Aktar"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Bu gizli tutulmalıdır. Bu bir şifreye benzer ve diğerleriyle paylaşılmaması gerekir. Birinin eline geçerse, sizi taklit edebilir."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Kullanıcı kimliği Belirle"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Uyarı: Kullanıcı kimliği değiştirmek kalıcıdır. Bunu yapmak istediğinizden emin misiniz? Eskisini yedeklediğinizden emin olun."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Oluşturan"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Otomatik Atla"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Sponsor Atladıktan Sonra Uyarı Göster"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Şu an buna ayarlı:"
|
||||
},
|
||||
"supportInvidious": {
|
||||
"message": "Invidious'a Destek Ver"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) üçüncü parti YouTube istemcisidir. Desteği etkinleştirmek için fazladan izinlere onay vermelisiniz. Bu Chrome ve Chromium bazlı tarayıcılarda gizli pencere modunda ÇALIŞMAZ."
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Invidious desteğini, otomatik atlamayı, butonları saklamayı ve daha fazlasını etkinleştir."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Invidious Oluşumu Ekle"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Özel Indivious oluşumu ekle. Bu SADECE alan adıyla düzenlenmelidir. Örnek: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Ekle"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "Bu geçersiz bir alan adı. Bu SADECE alan adı kısmını içermelidir. Örnek: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Invidious Oluşum Listesini Sıfırla"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "Invidious Oluşum listesini sıfırlamak üzeresiniz"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "Mevcut Oluşumlar:"
|
||||
},
|
||||
"enableAutoUpvote": {
|
||||
"message": "Otomatik Oy Ver"
|
||||
},
|
||||
"whatAutoUpvote": {
|
||||
"message": "Eğer bu ayar açıksa, eklenti eğer rapor etmediyseniz gördüğünüz tüm önerileri oylayacaktır. Eğer bildirim kapalıysa, bu gerçekleşmeyecektir."
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Minimum süre (saniye):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Belirlenen değerden kısa olan sponsor bölümleri atlanmayacak veya oynatıcıda gözükmeyecektir."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Sıradaki öneri belirlediğiniz minimum süre ayarından daha kısa. Bu zaten yollandığı ve bu ayardan dolayı yok sayıldığı anlamına gelebilir. Göndermek istediğinizden emin misiniz?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Karşıya Yükleme Butonunu Göster"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Bu buton, YouTube oynatıcısında bir zaman seçtiğiniz ve göndermeye hazır olduğunuzda gözükür."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock Sunucu Adresi"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "SponsorBlock'un sunucu ile iletişimi sağlamak için kullandığı adres.\nKendi sunucu kopyanız olmadığı sürece bu değiştirilmemelidir."
|
||||
},
|
||||
"save": {
|
||||
"message": "Kaydet"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Sıfırla"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "Bu adres doğru formatta değil. Başında http:// veya https:// olduğundan ve sonda / işareti olmadığından emin olun."
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Bunu sıfırlamak istediğinize emin misiniz?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Bu videonun listede olmadığı belirlendi. Bu videoyu sponsorlar için kontrol etmek istemiyorsanız iptale basınız."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Listedışı/Özel Videoları Görmezden Gel"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Bu ayar SponsorBlock eklentisini az miktarda yavaşlatacaktır. Sponsor kontrolleri, sunucuya video kimlik numarası göndermeyi gerektirir. Eğer listedışı videoların, video kimlik numaralarının internet üzerinden gönderilmesini istemiyorsanız bu seçeneği aktive edin."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com şu an desteklenmektedir"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Bütün Ayarlarını İçe/Dışa Aktar"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Bu, JSON formatında bütün kurulumunuzu gösterir. Kullanıcı kimliğinizi içerir, bu sebeple paylaşırken dikkatli olun."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Seçenekleri Ayarla"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "Uyarı: Ayarları değiştirmek kalıcıdır ve yüklemenizi bozabilir. Bunu yapmak istediğinizden emin misiniz? Eskisini yenilediğinizden emin olun."
|
||||
},
|
||||
"incorrectlyFormattedOptions": {
|
||||
"message": "Bu JSON doğru formatlanmamış. Ayarlarınız değiştirilmedi."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Bölüm Gönder"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Gönder"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "İptal"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Sil"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Önizle"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Düzenle"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "Onarım Bilgisini Panoya Kopyala"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "Panoya kopyalanamadı"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Panoya, geliştiricinin hata gideriminde veya ulaşmak istediğinde geliştiriciye sağlamak üzerine bilgileri kaydeder. Kullanıcı kimliği, beyaz listenizdeki kanallar ve düzenlenmiş sunucu adresleri gibi hassas bilgiler silinmiştir. Ancak tarayıcı bilgileri, işletim sisteminiz ve eklenti numaranız gibi bilgileri içerebilir. "
|
||||
},
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Bu çözüm bilgisi panoya kopyalandı. Paylaşmak istemediğiniz herhangi bir bilgiyi silmekte özgürsünüz. Bir yazı dosyası olarak kaydedin veya hata raporuna kopyalayın."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Anahtar"
|
||||
},
|
||||
"keyAlreadyUsedByYouTube": {
|
||||
"message": "YouTube tarafından zaten kullanımda. Lütfen başka bir anahtar seçin."
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "başka bir eyleme bağlı. Lütfen başka bir anahtar seçin."
|
||||
},
|
||||
"to": {
|
||||
"message": "'e",
|
||||
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Başlangıç"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Bitiş"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Etkileşim (Beğeni, abone olma, takip etme gibi gereksiz)"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Kendi Reklamını Yapma ve Ürün"
|
||||
},
|
||||
"category_offtopic": {
|
||||
"message": "Konudışı (Öznel)"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Devredışı"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Elle Atla"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Arama Çubuğunda Göster"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Beta Deneme Sunucusunu Devreye Sok"
|
||||
},
|
||||
"whatEnableTestingServer": {
|
||||
"message": "Önerileriniz ve oylarınız ana sunucuya GÖNDERİLMEYECEKTİR. Bunu sadece deneme amacıyla kullanın."
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "Tüm öneriler ve oylar, test sunucusuna bağlandığınız sürece ana sunucuya iletilmeyecektir. Gerçek öneriler yapmak istediğinizde bu ayarı kapatmayı unutmayın."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Şimdi)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Daha Fazla Kategori"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Son)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "gizlendi: eksile"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "gizlendi: çok kısa"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Sponsorları Atlamadan Önce Kanal Kontrolünü Zorla"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Varsayılan olarak, eklenti kanalın ne olduğunu bilmeden önce sponsorları atlayacaktır. Varsayılan olarak, beyaz listede olan kanallarda sıfır saniyelik sponsor bölümleri atlanacaktır. Bu ayarı aktifleştirmek bunu engelleyecektir ancak kanal kimlik bilgisini almak biraz vakit alacağından atlamalarda gecikmeler yaratabilir. Eğer hızlı bir internetiniz varsa bu gecikmeler farkedilmeyebilir."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Sponsorları Atlamadan Önce Kanal Kontrolünü Zorlamayı Gözden Geçir"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,452 @@
|
||||
{}
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "SponsorBlock для YouTube - Пропускайте спонсорські вставки",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Пропускайте спонсорські вставки в відео на YouTube. Повідомляйте про спонсорські вставки в відео, які Ви дивіться, щоб заощадити час інших користувачів.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Сервер відхилив цей запит"
|
||||
},
|
||||
"429": {
|
||||
"message": "Ви відправили занадто багато спонсорів для цього відео. Ви впевнені, що їх так багато?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Цей запит був відправлений раніше"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Канал доданий у білий список!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "спонсори"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "спонсорів"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "спонсорська вставка"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "спонсорські вставки"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Спонсор пропущений"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Помилка"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Повідомити, що інформація про це спонсорський сегменті є хибною."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Закрити"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Завантаження..."
|
||||
},
|
||||
"Mins": {
|
||||
"message": "хв"
|
||||
},
|
||||
"Secs": {
|
||||
"message": "сек"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Не відображати"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Натисніть «Назад», щоб повернутися назад."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Назад"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Пропустити"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Пауза"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "Щоб змінити або видалити окремі значення, натисніть кнопку «Інформація» або відкрийте спливаюче вікно розширення, клацнувши значок розширення в правому верхньому куті."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Ви впевнені, що хочете видалити цю інформацію?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "При надсиланні звіту про спонсорський сегмент сталася помилка. Спробуйте надіслати його пізніше."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Спонсори цього відео вже знаходяться в базі даних!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Спонсорські вставки не знайдені"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Спонсорська вставка починається зараз"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Спонсорська вставка закінчується зараз"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Можливо, це не вкладка YouTube, або Ви натиснули занадто рано.\n Якщо це вкладка YouTube,\n закрийте це спливаюче вікно і відкрийте його знову."
|
||||
},
|
||||
"success": {
|
||||
"message": "Успіх!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Голос зарахований!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Ви вже проголосували таким чином раніше."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Здається, сервер не працює. Зв'яжіться з розробником."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Помилка з'єднання. Код помилки: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Ви точно хочете надіслати звіт про спонсорські вставки у відео з ідентифікатором"
|
||||
},
|
||||
"leftTimes": {
|
||||
"message": "Ви ще не надіслали звіти про деякі спонсорські вставки. Хочете повернутися на цю сторінку, щоб надіслати їх (вони не видаляються)."
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Ви впевнені, що хочете надіслати цю інформацію?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Додати канал в білий список"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Видалити канал з білого списку"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Проголосувати за час спонсорської вставки"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Записати час спонсорської вставки"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "На даний момент Ви надіслали"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Ви допомогли людям заощадити "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Подивитися дошку пошани"
|
||||
},
|
||||
"here": {
|
||||
"message": "тут"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Натисніть кнопку нижче, коли спонсорська вставка починається і закінчується, щоб записати\nі надіслати її в базу даних."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Підказка: Натисніть клавішу крапки з комою, щоб повідомити початок/кінець спонсорської вставки і пропозицію для надсилання. (Це можна змінити в налаштуваннях)"
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Останній обраний час спонсорської вставки"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Очистити час"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Надіслати час"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Воно використовується на публічній сторінці статистики, щоб показати Ваш внесок. Її можна подивитися"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Встановити ім'я користувача"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Приєднуйтесь до офіційного сервера Discord, щоб залишити пропозиції і зворотний зв'язок!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Приховати це"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Налаштування"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Показувати кнопки в плеєрі YouTube"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Приховати кнопки в плеєрі YouTube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Це налаштування приховує кнопки для надсилання спонсорських вставок, які з'являються в плеєрі YouTube."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Показувати кнопку інформації в плеєрі YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Приховати кнопку інформації в плеєрі YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Ця кнопка відкриває спливаюче вікно на сторінці YouTube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Приховати кнопку видалення в плеєрі YouTube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Показувати кнопку видалення в плеєрі YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Ця кнопка дозволяє очистити всі спонсорські вставки в плеєрі YouTube."
|
||||
},
|
||||
"disableViewTracking": {
|
||||
"message": "Вимкнути відстеження кількості пропусків спонсорських вставок"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Увімкнути відстеження кількості пропусків спонсорських вставок"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"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"
|
||||
},
|
||||
"sourceCode": {
|
||||
"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."
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Призначити гарячу клавішу для початку спонсорської вставки"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Призначити гарячу клавішу для надсилання"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Натисніть, щоб вибрати її"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Кнопка призначена на: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Таймаут підключення. Перевірте ваше з'єднання з інтернетом. Якщо ваш інтернет працює, сервер, швидше за все, перевантажений або лежить."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Відключити SponsorBlock"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "Увімкнути SponsorBlock"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Ваша робота",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Схоже, він перевантажений. Спробуйте ще раз через кілька секунд."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Код помилки: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Пропустити спонсорську вставку?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Пропустити"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Вимкнути автоматичний пропуск"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Увімкнути автоматичний пропуск"
|
||||
},
|
||||
"autoSkipDescription": {
|
||||
"message": "Автоматичний пропуск буде пропускати спонсорські вставки за Вас. Якщо вимкнено, буде показуватися повідомлення з пропозицією пропустити."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Ви пропустили "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Ви заощадили "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "хвилину"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "хвилин"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "година"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "годин"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Ви заощадили людям"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " їх життя."
|
||||
},
|
||||
"guildlinesSummary": {
|
||||
"message": "- Переконайтеся, що Ваш сегмент містить тільки платну інтеграцію, і більше нічого.\n- Переконайтеся, що пропуск цього сегмента не пропустить жодного цінного контенту\n- Якщо все відео цілком спонсорське, будь ласка, не повідомляйте про нього. Система для повідомлення про цілі відео скоро вийде.\n- Будь ласка, не повідомляйте про відмови від відповідальності, які можуть показати упередженість (якщо відео з оглядом проплачено, не пропускайте, коли вони це згадують)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Дивіться стан сервера на status.sponsor.ajay.app."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Імпортувати/Експортувати Ваш ідентифікатор користувача"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Це потрібно тримати в секреті. Це як пароль, не варто ним ні з ким ділитися. Якщо він у кого-то є, він зможе видати себе за Вас."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Встановити ідентифікатор користувача"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Увага: зміна ідентифікатора користувача є незворотнім. Ви дійсно хочете це зробити? Зробіть резервну копію вашого старого про всяк випадок."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Створено"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Автоматичний пропуск"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Показувати сповіщення після пропуску спонсорської вставки"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Він зараз призначений на:"
|
||||
},
|
||||
"supportInvidious": {
|
||||
"message": "Підтримка Invidious"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) - це неофіційний клієнт YouTube. Щоб увімкнути підтримку, Вам знадобиться прийняти додаткові дозволи. Це НЕ працює в приватному режимі в Chrome і інших варіантах Chromium."
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Увімкнути підтримку Invidious, вимкнути автоматичний пропуск, приховати кнопки і не тільки."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Додати інстанси Invidious"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Додати свій інстанси Invidious. Формат: ТІЛЬКИ домен. Наприклад: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Додати"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "Це неправильний домен. Введіть ТІЛЬКИ домен. Наприклад: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Скинути список інстанси Invidious"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "Ви збираєтеся скинути список інстанси Invidious"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "Поточні інстанси:"
|
||||
},
|
||||
"enableAutoUpvote": {
|
||||
"message": "Автоматично голосувати \"за\""
|
||||
},
|
||||
"whatAutoUpvote": {
|
||||
"message": "Якщо це увімкнено, розширення буде голосувати \"за\" всі пропозиції інших користувачів, якщо Ви на них не поскаржитеся. Якщо повідомлення вимкнуто, це не буде відбуватися."
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Мінімальна тривалість (секунд):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Спонсорські сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Наступний діапазон часу коротше, ніж Ваше налаштування мінімальної тривалості. Це може означати, що він вже був надісланий, і просто ігнорується через це налаштування. Ви дійсно хочете надіслати?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Показувати кнопку надсилання"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Ця кнопка з'являється в плеєрі YouTube після того, як Ви вибрали позначку часу і готові до надсилання."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Адреса сервера SponsorBlock"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "Адреса, за якою SponsorBlock звертається до сервера.\nМіняйте тільки якщо Ви підняли свій сервер."
|
||||
},
|
||||
"save": {
|
||||
"message": "Зберегти"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Скинути"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "Ця адреса неправильного формату. Переконайтеся, що він починається з http: // або https: //, і що на кінці немає слеша."
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Ви дійсно хочете це скинути?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Було виявлено, що це відео непублічна. Натисніть \"скасування\", якщо не хочете перевіряти його на спонсорів."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ігнорувати непублічні відео"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Це налаштування значно сповільнить SponsorBlock. Пошук спонсорів вимагає надсилання ідентифікатора відео на сервер. Якщо Вас турбує відправка ідентифікаторів непублічних відео по інтернету, увімкніть це налаштування."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com тепер підтримується"
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Надіслати сегмент"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Надіслати"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Скасувати"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Видалити"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Попередній перегляд"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Редагувати"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Спонсор"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Вимкнути"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Пропуск вручну"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Зараз)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Більше категорій"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Кінець)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -527,5 +527,32 @@
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "更多类别"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(结束)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "隐藏:差评"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "隐藏:过短"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"message": "频道 ID 尚未加载。"
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "似乎某些东西正在阻止 SponsorBlock 获取视频数据的功能。它很可能是您的广告拦截器。请查看 https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "如果这种情况不断发生,它可能是由您的广告拦截器引起的。请查看 https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "跳过赞助商广告前强制进行频道检查"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "默认情况下,即使还未检测出当前是什么频道,也会立即跳过赞助商广告。默认情况下,即使在白名单中的频道,一些在开头的赞助商广告也可能被跳过。启用此选项将防止这种情况,但所有的跳过将会产生轻微的延迟,因为获取频道 ID 需要一点时间。如果您的网速很快,那延迟可能非常短。"
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "请考虑启用跳过赞助商广告前强制进行频道检查"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,11 +11,28 @@
|
||||
z-index: 40;
|
||||
}
|
||||
|
||||
.sbHidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
.previewbar {
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* Preview Bar page hacks */
|
||||
|
||||
.sbTooltipTwoTitleThumbnailOffset {
|
||||
bottom: -5px !important;
|
||||
}
|
||||
|
||||
.sbTooltipOneTitleThumbnailOffset {
|
||||
bottom: 10px !important;
|
||||
}
|
||||
|
||||
/* */
|
||||
|
||||
.popup {
|
||||
z-index: 10;
|
||||
width: 100%;
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
<span id="sponsorTimesSkipsDoneDisplay" class="popupElement">
|
||||
0
|
||||
</span>
|
||||
<span id="sponsorTimesSkipsDoneEndWord" class="popupElement">__MSG_Segments__</span> (since February).
|
||||
<span id="sponsorTimesSkipsDoneEndWord" class="popupElement">__MSG_Segments__</span>
|
||||
</div>
|
||||
|
||||
<div id="sponsorTimeSavedContainer" class="popupElement" style="display: none">
|
||||
|
||||
@@ -47,7 +47,7 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
//this allows the callback to be called later
|
||||
return true;
|
||||
case "submitVote":
|
||||
submitVote(request.type, request.UUID, callback);
|
||||
submitVote(request.type, request.UUID, request.category, callback);
|
||||
|
||||
//this allows the callback to be called later
|
||||
return true;
|
||||
@@ -147,7 +147,7 @@ function addSponsorTime(time, videoID, callback) {
|
||||
});
|
||||
}
|
||||
|
||||
function submitVote(type, UUID, callback) {
|
||||
function submitVote(type, UUID, category, callback) {
|
||||
let userID = Config.config.userID;
|
||||
|
||||
if (userID == undefined || userID === "undefined") {
|
||||
@@ -156,8 +156,10 @@ function submitVote(type, UUID, callback) {
|
||||
Config.config.userID = userID;
|
||||
}
|
||||
|
||||
let typeSection = (type !== undefined) ? "&type=" + type : "&category=" + category;
|
||||
|
||||
//publish this vote
|
||||
utils.sendRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + "&type=" + type, function(xmlhttp, error) {
|
||||
utils.sendRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + typeSection, function(xmlhttp, error) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
callback({
|
||||
successType: 1
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import * as React from "react";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import Config from "../config"
|
||||
import { ContentContainer, SponsorHideType } from "../types";
|
||||
|
||||
@@ -19,16 +20,19 @@ export interface SkipNoticeProps {
|
||||
}
|
||||
|
||||
export interface SkipNoticeState {
|
||||
noticeTitle: string,
|
||||
noticeTitle: string;
|
||||
|
||||
messages: string[],
|
||||
messages: string[];
|
||||
|
||||
countdownTime: number,
|
||||
countdownTime: number;
|
||||
maxCountdownTime: () => number;
|
||||
countdownText: string,
|
||||
countdownText: string;
|
||||
|
||||
unskipText: string,
|
||||
unskipCallback: () => void
|
||||
unskipText: string;
|
||||
unskipCallback: () => void;
|
||||
|
||||
downvoting: boolean;
|
||||
choosingCategory: boolean;
|
||||
}
|
||||
|
||||
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
|
||||
@@ -43,10 +47,15 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
idSuffix: any;
|
||||
|
||||
noticeRef: React.MutableRefObject<NoticeComponent>;
|
||||
categoryOptionRef: React.RefObject<HTMLSelectElement>;
|
||||
|
||||
// Used to update on config change
|
||||
configListener: () => void;
|
||||
|
||||
constructor(props: SkipNoticeProps) {
|
||||
super(props);
|
||||
this.noticeRef = React.createRef();
|
||||
this.categoryOptionRef = React.createRef();
|
||||
|
||||
this.UUID = props.UUID;
|
||||
this.autoSkip = props.autoSkip;
|
||||
@@ -83,7 +92,10 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
countdownText: null,
|
||||
|
||||
unskipText: chrome.i18n.getMessage("unskip"),
|
||||
unskipCallback: this.unskip.bind(this)
|
||||
unskipCallback: this.unskip.bind(this),
|
||||
|
||||
downvoting: false,
|
||||
choosingCategory: false
|
||||
}
|
||||
|
||||
if (!this.autoSkip) {
|
||||
@@ -115,7 +127,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
timed={true}
|
||||
maxCountdownTime={this.state.maxCountdownTime}
|
||||
ref={this.noticeRef}
|
||||
closeListener={this.props.closeListener}>
|
||||
closeListener={() => this.closeListener()}>
|
||||
|
||||
{(Config.config.audioNotificationOnSkip) && <audio ref={(source) => { this.audio = source; }}>
|
||||
<source src={chrome.extension.getURL("icons/beep.ogg")} type="audio/ogg"></source>
|
||||
@@ -124,7 +136,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
{/* Text Boxes */}
|
||||
{this.getMessageBoxes()}
|
||||
|
||||
{/* Last Row */}
|
||||
{/* Bottom Row */}
|
||||
<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}>
|
||||
|
||||
{/* Vote Button Container */}
|
||||
@@ -145,7 +157,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
className="sponsorSkipObject voteButton"
|
||||
src={chrome.extension.getURL("icons/report.png")}
|
||||
title={chrome.i18n.getMessage("reportButtonInfo")}
|
||||
onClick={() => this.contentContainer().vote(0, this.UUID, this)}>
|
||||
onClick={() => this.adjustDownvotingState(true)}>
|
||||
|
||||
</img>
|
||||
|
||||
@@ -174,6 +186,54 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
</tr>
|
||||
|
||||
{/* Downvote Options Row */}
|
||||
{this.state.downvoting &&
|
||||
<tr id={"sponsorSkipNoticeDownvoteOptionsRow" + this.idSuffix}>
|
||||
<td id={"sponsorTimesDownvoteOptionsContainer" + this.idSuffix}>
|
||||
|
||||
{/* Normal downvote */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.contentContainer().vote(0, this.UUID, undefined, this)}>
|
||||
{chrome.i18n.getMessage("downvoteDescription")}
|
||||
</button>
|
||||
|
||||
{/* Category vote */}
|
||||
{Config.config.testingServer &&
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.openCategoryChooser()}>
|
||||
|
||||
{chrome.i18n.getMessage("incorrectCategory")}
|
||||
</button>
|
||||
}
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
}
|
||||
|
||||
{/* Category Chooser Row */}
|
||||
{this.state.choosingCategory &&
|
||||
<tr id={"sponsorSkipNoticeCategoryChooserRow" + this.idSuffix}>
|
||||
<td>
|
||||
{/* Category Selector */}
|
||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||
className="sponsorTimeCategories"
|
||||
defaultValue={utils.getSponsorTimeFromUUID(this.props.contentContainer().sponsorTimes, this.props.UUID).category}
|
||||
ref={this.categoryOptionRef}
|
||||
onChange={this.categorySelectionChange.bind(this)}>
|
||||
|
||||
{this.getCategoryOptions()}
|
||||
</select>
|
||||
|
||||
{/* Submit Button */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.contentContainer().vote(undefined, this.UUID, this.categoryOptionRef.current.value, this)}>
|
||||
|
||||
{chrome.i18n.getMessage("submit")}
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
||||
</NoticeComponent>
|
||||
);
|
||||
}
|
||||
@@ -202,6 +262,70 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
return elements;
|
||||
}
|
||||
|
||||
adjustDownvotingState(value: boolean) {
|
||||
if (!value) this.clearConfigListener();
|
||||
|
||||
this.setState({
|
||||
downvoting: value,
|
||||
choosingCategory: false
|
||||
});
|
||||
}
|
||||
|
||||
clearConfigListener() {
|
||||
if (this.configListener) {
|
||||
Config.configListeners.splice(Config.configListeners.indexOf(this.configListener), 1);
|
||||
this.configListener = null;
|
||||
}
|
||||
}
|
||||
|
||||
openCategoryChooser() {
|
||||
// Add as a config listener
|
||||
this.configListener = () => this.forceUpdate();
|
||||
Config.configListeners.push(this.configListener);
|
||||
|
||||
this.setState({
|
||||
choosingCategory: true,
|
||||
downvoting: false
|
||||
});
|
||||
}
|
||||
|
||||
getCategoryOptions() {
|
||||
let elements = [];
|
||||
|
||||
for (const category of Config.config.categorySelections) {
|
||||
elements.push(
|
||||
<option value={category.name}
|
||||
key={category.name}>
|
||||
{chrome.i18n.getMessage("category_" + category.name)}
|
||||
</option>
|
||||
);
|
||||
}
|
||||
|
||||
if (elements.length < CompileConfig.categoryList.length) {
|
||||
// Add show more button
|
||||
elements.push(
|
||||
<option value={"moreCategories"}
|
||||
key={"moreCategories"}>
|
||||
{chrome.i18n.getMessage("moreCategories")}
|
||||
</option>
|
||||
);
|
||||
}
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>) {
|
||||
// See if show more categories was pressed
|
||||
if (event.target.value === "moreCategories") {
|
||||
// Open options page
|
||||
chrome.runtime.sendMessage({"message": "openConfig"});
|
||||
|
||||
// Reset option to original
|
||||
event.target.value = utils.getSponsorTimeFromUUID(this.props.contentContainer().sponsorTimes, this.props.UUID).category;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
unskip() {
|
||||
this.contentContainer().unskipSponsorTime(this.UUID);
|
||||
|
||||
@@ -258,22 +382,22 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
afterDownvote() {
|
||||
afterDownvote(type: number, category: string) {
|
||||
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
|
||||
this.setNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
|
||||
|
||||
this.adjustDownvotingState(false);
|
||||
|
||||
//remove this sponsor from the sponsors looked up
|
||||
//find which one it is
|
||||
for (let i = 0; i < this.contentContainer().sponsorTimes.length; i++) {
|
||||
if (this.contentContainer().sponsorTimes[i].UUID == this.UUID) {
|
||||
//this one is the one to hide
|
||||
|
||||
//add this as a hidden sponsorTime
|
||||
this.contentContainer().sponsorTimes[i].hidden = SponsorHideType.Downvoted;
|
||||
|
||||
this.contentContainer().updatePreviewBar();
|
||||
break;
|
||||
// Change the sponsor locally
|
||||
let sponsorTime = utils.getSponsorTimeFromUUID(this.contentContainer().sponsorTimes, this.UUID);
|
||||
if (sponsorTime) {
|
||||
if (type === 0) {
|
||||
sponsorTime.hidden = SponsorHideType.Downvoted;
|
||||
} else if (category) {
|
||||
sponsorTime.category = category;
|
||||
}
|
||||
|
||||
this.contentContainer().updatePreviewBar();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -316,6 +440,12 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
//show button again
|
||||
document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix).style.removeProperty("display");
|
||||
}
|
||||
|
||||
closeListener() {
|
||||
this.clearConfigListener();
|
||||
|
||||
this.props.closeListener();
|
||||
}
|
||||
}
|
||||
|
||||
export default SkipNoticeComponent;
|
||||
@@ -29,6 +29,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
categoryOptionRef: React.RefObject<HTMLSelectElement>;
|
||||
|
||||
configUpdateListener: () => void;
|
||||
|
||||
constructor(props: SponsorTimeEditProps) {
|
||||
super(props);
|
||||
|
||||
@@ -49,7 +51,16 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
});
|
||||
|
||||
// Add as a config listener
|
||||
Config.configListeners.push(this.configUpdate.bind(this));
|
||||
if (!this.configUpdateListener) {
|
||||
this.configUpdateListener = () => this.configUpdate();
|
||||
Config.configListeners.push(this.configUpdate.bind(this));
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
if (this.configUpdateListener) {
|
||||
Config.configListeners.splice(Config.configListeners.indexOf(this.configUpdate.bind(this)));
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
@@ -61,6 +72,15 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
style.marginTop = "15px";
|
||||
}
|
||||
|
||||
// This method is required to get !important
|
||||
// https://stackoverflow.com/a/45669262/1985387
|
||||
let oldYouTubeDarkStyles = (node) => {
|
||||
if (node) {
|
||||
node.style.setProperty("color", "black", "important");
|
||||
node.style.setProperty("text-shadow", "none", "important");
|
||||
}
|
||||
};
|
||||
|
||||
// Create time display
|
||||
let timeDisplay: JSX.Element;
|
||||
let sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
|
||||
@@ -78,6 +98,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
<input id={"submittingTimeMinutes0" + this.idSuffix}
|
||||
className="sponsorTimeEdit sponsorTimeEditMinutes"
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="number"
|
||||
value={this.state.sponsorTimeEdits[0][0]}
|
||||
onChange={(e) => {
|
||||
@@ -90,6 +111,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
<input id={"submittingTimeSeconds0" + this.idSuffix}
|
||||
className="sponsorTimeEdit sponsorTimeEditSeconds"
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="number"
|
||||
value={this.state.sponsorTimeEdits[0][1]}
|
||||
onChange={(e) => {
|
||||
@@ -106,6 +128,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
<input id={"submittingTimeMinutes1" + this.idSuffix}
|
||||
className="sponsorTimeEdit sponsorTimeEditMinutes"
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="text"
|
||||
value={this.state.sponsorTimeEdits[1][0]}
|
||||
onChange={(e) => {
|
||||
@@ -118,6 +141,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
<input id={"submittingTimeSeconds1" + this.idSuffix}
|
||||
className="sponsorTimeEdit sponsorTimeEditSeconds"
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="text"
|
||||
value={this.state.sponsorTimeEdits[1][1]}
|
||||
onChange={(e) => {
|
||||
@@ -236,7 +260,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
|
||||
setTimeToNow(index: number) {
|
||||
this.setTimeTo(index, this.props.contentContainer().v.currentTime);
|
||||
this.setTimeTo(index, this.props.contentContainer().getRoughCurrentTime());
|
||||
}
|
||||
|
||||
setTimeToEnd() {
|
||||
|
||||
@@ -93,13 +93,6 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
<td className="sponsorSkipNoticeRightSection"
|
||||
style={{position: "relative"}}>
|
||||
|
||||
{/* Cancel Button */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={this.cancel.bind(this)}>
|
||||
|
||||
{chrome.i18n.getMessage("cancel")}
|
||||
</button>
|
||||
|
||||
{/* Submit Button */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={this.submit.bind(this)}>
|
||||
@@ -167,6 +160,18 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
ref.current.saveEditTimes();
|
||||
}
|
||||
|
||||
// Check if any non music categories are being used on a music video
|
||||
if (this.contentContainer().videoInfo.microformat.playerMicroformatRenderer.category === "Music") {
|
||||
let sponsorTimesSubmitting = this.props.contentContainer().sponsorTimesSubmitting;
|
||||
for (const sponsorTime of sponsorTimesSubmitting) {
|
||||
if (!sponsorTime.category.startsWith("music_")) {
|
||||
if (!confirm(chrome.i18n.getMessage("nonMusicCategoryOnMusic"))) return;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.props.callback();
|
||||
|
||||
this.cancel();
|
||||
|
||||
@@ -123,7 +123,7 @@ var Config: SBObject = {
|
||||
hideUploadButtonPlayerControls: false,
|
||||
hideDiscordLaunches: 0,
|
||||
hideDiscordLink: false,
|
||||
invidiousInstances: ["invidio.us", "invidiou.sh", "invidious.snopyta.org"],
|
||||
invidiousInstances: ["invidio.us", "invidious.snopyta.org"],
|
||||
autoUpvote: true,
|
||||
supportInvidious: false,
|
||||
serverAddress: CompileConfig.serverAddress,
|
||||
@@ -254,7 +254,7 @@ async function migrateOldFormats() {
|
||||
|
||||
// Channel URLS
|
||||
if (Config.config.whitelistedChannels.length > 0 &&
|
||||
(Config.config.whitelistedChannels[0].includes("/") || Config.config.whitelistedChannels[0] == null)) {
|
||||
(Config.config.whitelistedChannels[0] == null || Config.config.whitelistedChannels[0].includes("/"))) {
|
||||
let newChannelList: string[] = [];
|
||||
for (const item of Config.config.whitelistedChannels) {
|
||||
if (item != null) {
|
||||
|
||||
@@ -114,7 +114,9 @@ var skipNoticeContentContainer: ContentContainer = () => ({
|
||||
sponsorSubmissionNotice: submissionNotice,
|
||||
resetSponsorSubmissionNotice,
|
||||
changeStartSponsorButton,
|
||||
previewTime
|
||||
previewTime,
|
||||
videoInfo,
|
||||
getRoughCurrentTime
|
||||
});
|
||||
|
||||
//get messages from the background script and the popup
|
||||
@@ -178,7 +180,7 @@ function messageListener(request: any, sender: any, sendResponse: (response: any
|
||||
return
|
||||
case "getCurrentTime":
|
||||
sendResponse({
|
||||
currentTime: video.currentTime
|
||||
currentTime: getRoughCurrentTime()
|
||||
});
|
||||
|
||||
break;
|
||||
@@ -461,6 +463,7 @@ function cancelSponsorSchedule(): void {
|
||||
*/
|
||||
function startSponsorSchedule(includeIntersectingSegments: boolean = false, currentTime?: number): void {
|
||||
cancelSponsorSchedule();
|
||||
|
||||
if (video.paused) return;
|
||||
|
||||
if (Config.config.disableSkipping || channelWhitelisted || (channelID === null && Config.config.forceChannelCheck)){
|
||||
@@ -478,6 +481,7 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
||||
let currentSkip = skipInfo.array[skipInfo.index];
|
||||
let skipTime: number[] = [currentSkip.segment[0], skipInfo.array[skipInfo.endIndex].segment[1]];
|
||||
let timeUntilSponsor = skipTime[0] - currentTime;
|
||||
let videoID = sponsorVideoID;
|
||||
|
||||
// Don't skip if this category should not be skipped
|
||||
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ShowOverlay) return;
|
||||
@@ -486,7 +490,7 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
||||
let forcedSkipTime: number = null;
|
||||
let forcedIncludeIntersectingSegments = false;
|
||||
|
||||
if (incorrectVideoIDCheck()) return;
|
||||
if (incorrectVideoIDCheck(videoID)) return;
|
||||
|
||||
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
|
||||
skipToTime(video, skipInfo.endIndex, skipInfo.array, skipInfo.openNotice);
|
||||
@@ -515,9 +519,9 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
||||
*
|
||||
* TODO: Remove this bug catching if statement when the bug is found
|
||||
*/
|
||||
function incorrectVideoIDCheck(): boolean {
|
||||
function incorrectVideoIDCheck(videoID?: string): boolean {
|
||||
let currentVideoID = getYouTubeVideoID(document.URL);
|
||||
if (currentVideoID !== sponsorVideoID) {
|
||||
if (currentVideoID !== (videoID || sponsorVideoID)) {
|
||||
// Something has really gone wrong
|
||||
console.error("[SponsorBlock] The videoID recorded when trying to skip is different than what it should be.");
|
||||
console.error("[SponsorBlock] VideoID recorded: " + sponsorVideoID + ". Actual VideoID: " + currentVideoID);
|
||||
@@ -967,7 +971,7 @@ function skipToTime(v: HTMLVideoElement, index: number, sponsorTimes: SponsorTim
|
||||
|
||||
//auto-upvote this sponsor
|
||||
if (Config.config.trackViewCount && autoSkip && Config.config.autoUpvote) {
|
||||
vote(1, currentUUID, null);
|
||||
vote(1, currentUUID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1117,6 +1121,36 @@ async function updateVisibilityOfPlayerControlsButton(): Promise<boolean> {
|
||||
return createdButtons;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for submitting. This will use the HTML displayed number when required as the video's
|
||||
* current time is out of date while scrubbing or at the end of the video. This is not needed
|
||||
* for sponsor skipping as the video is not playing during these times.
|
||||
*/
|
||||
function getRoughCurrentTime(): number {
|
||||
let htmlCurrentTimeString = document.querySelector(".ytp-time-current").textContent;
|
||||
let htmlDurationString = document.querySelector(".ytp-time-duration").textContent;
|
||||
|
||||
// Used to check if endscreen content is visible
|
||||
let endScreenContent = document.querySelector(".ytp-endscreen-content");
|
||||
// Used to check autoplay display
|
||||
let autoPlayDisplay: HTMLDivElement = document.querySelector(".ytp-upnext");
|
||||
|
||||
if (htmlCurrentTimeString == htmlDurationString
|
||||
|| endScreenContent.childElementCount > 0 || autoPlayDisplay.style.display !== "none") {
|
||||
// At the end of the video
|
||||
return video.duration;
|
||||
}
|
||||
|
||||
let htmlCurrentTimeSections = htmlCurrentTimeString.split(":")[0];
|
||||
let htmlCurrentTime: number = parseInt(htmlCurrentTimeSections[0]) * 60 + parseInt(htmlCurrentTimeSections[1]);
|
||||
|
||||
if (Math.abs(video.currentTime - htmlCurrentTime) > 3) {
|
||||
return htmlCurrentTime;
|
||||
} else {
|
||||
return video.currentTime;
|
||||
}
|
||||
}
|
||||
|
||||
function startSponsorClicked() {
|
||||
//it can't update to this info yet
|
||||
closeInfoMenu();
|
||||
@@ -1126,11 +1160,11 @@ function startSponsorClicked() {
|
||||
//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] = video.currentTime;
|
||||
sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment[1] = getRoughCurrentTime();
|
||||
} else {
|
||||
//it is a start time
|
||||
sponsorTimesSubmitting.push({
|
||||
segment: [video.currentTime],
|
||||
segment: [getRoughCurrentTime()],
|
||||
UUID: null,
|
||||
// Default to sponsor
|
||||
category: "sponsor"
|
||||
@@ -1306,7 +1340,7 @@ function clearSponsorTimes() {
|
||||
}
|
||||
|
||||
//if skipNotice is null, it will not affect the UI
|
||||
function vote(type, UUID, skipNotice?: SkipNoticeComponent) {
|
||||
function vote(type: number, UUID: string, category?: string, skipNotice?: SkipNoticeComponent) {
|
||||
if (skipNotice !== null && skipNotice !== undefined) {
|
||||
//add loading info
|
||||
skipNotice.addVoteButtonInfo.bind(skipNotice)("Loading...")
|
||||
@@ -1319,7 +1353,7 @@ function vote(type, UUID, skipNotice?: SkipNoticeComponent) {
|
||||
if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].UUID === null) return;
|
||||
|
||||
// See if the local time saved count and skip count should be saved
|
||||
if (type == 0 && sponsorSkipped[sponsorIndex] || type == 1 && !sponsorSkipped[sponsorIndex]) {
|
||||
if (type === 0 && sponsorSkipped[sponsorIndex] || type === 1 && !sponsorSkipped[sponsorIndex]) {
|
||||
let factor = 1;
|
||||
if (type == 0) {
|
||||
factor = -1;
|
||||
@@ -1336,15 +1370,16 @@ function vote(type, UUID, skipNotice?: SkipNoticeComponent) {
|
||||
chrome.runtime.sendMessage({
|
||||
message: "submitVote",
|
||||
type: type,
|
||||
UUID: UUID
|
||||
UUID: UUID,
|
||||
category: category
|
||||
}, function(response) {
|
||||
if (response != undefined) {
|
||||
//see if it was a success or failure
|
||||
if (skipNotice != null) {
|
||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||
//success (treat rate limits as a success)
|
||||
if (type == 0) {
|
||||
skipNotice.afterDownvote.bind(skipNotice)();
|
||||
if (type === 0 || category) {
|
||||
skipNotice.afterDownvote.bind(skipNotice)(type, category);
|
||||
}
|
||||
} else if (response.successType == 0) {
|
||||
//failure: duplicate vote
|
||||
|
||||
@@ -50,11 +50,11 @@ let barTypes = {
|
||||
color: "#bfbf35",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"offtopic": {
|
||||
"music_offtopic": {
|
||||
color: "#ff9900",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-offtopic": {
|
||||
"preview-music_offtopic": {
|
||||
color: "#a6634a",
|
||||
opacity: "0.7"
|
||||
}
|
||||
@@ -65,6 +65,9 @@ class PreviewBar {
|
||||
parent: any;
|
||||
onMobileYouTube: boolean;
|
||||
|
||||
timestamps: number[][];
|
||||
types: string;
|
||||
|
||||
constructor(parent, onMobileYouTube) {
|
||||
this.container = document.createElement('ul');
|
||||
this.container.id = 'previewbar';
|
||||
@@ -73,6 +76,82 @@ class PreviewBar {
|
||||
this.onMobileYouTube = onMobileYouTube;
|
||||
|
||||
this.updatePosition(parent);
|
||||
|
||||
this.setupHoverText();
|
||||
}
|
||||
|
||||
setupHoverText() {
|
||||
let seekBar = document.querySelector(".ytp-progress-bar-container");
|
||||
|
||||
// Create label placeholder
|
||||
let tooltipTextWrapper = document.querySelector(".ytp-tooltip-text-wrapper");
|
||||
let titleTooltip = document.querySelector(".ytp-tooltip-title");
|
||||
let categoryTooltip = document.createElement("div");
|
||||
categoryTooltip.className = "sbHidden ytp-tooltip-title";
|
||||
categoryTooltip.id = "sponsor-block-category-tooltip"
|
||||
|
||||
tooltipTextWrapper.insertBefore(categoryTooltip, titleTooltip.nextSibling);
|
||||
|
||||
let mouseOnSeekBar = false;
|
||||
|
||||
seekBar.addEventListener("mouseenter", (event) => {
|
||||
mouseOnSeekBar = true;
|
||||
});
|
||||
|
||||
seekBar.addEventListener("mouseleave", (event) => {
|
||||
mouseOnSeekBar = false;
|
||||
categoryTooltip.classList.add("sbHidden");
|
||||
});
|
||||
|
||||
const observer = new MutationObserver(() => {
|
||||
if (!mouseOnSeekBar) return;
|
||||
|
||||
let tooltips = document.querySelectorAll(".ytp-tooltip-text");
|
||||
for (const tooltip of tooltips) {
|
||||
let splitData = tooltip.textContent.split(":");
|
||||
if (splitData.length === 2 && !isNaN(parseInt(splitData[0])) && !isNaN(parseInt(splitData[1]))) {
|
||||
// Add label
|
||||
let timeInSeconds = parseInt(splitData[0]) * 60 + parseInt(splitData[1]);
|
||||
|
||||
// Find category at that location
|
||||
let category = null;
|
||||
for (let i = 0; i < this.timestamps.length; i++) {
|
||||
if (this.timestamps[i][0] < timeInSeconds && this.timestamps[i][1] > timeInSeconds){
|
||||
category = this.types[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (category === null && !categoryTooltip.classList.contains("sbHidden")) {
|
||||
categoryTooltip.classList.add("sbHidden");
|
||||
tooltipTextWrapper.classList.remove("sbTooltipTwoTitleThumbnailOffset");
|
||||
tooltipTextWrapper.classList.remove("sbTooltipOneTitleThumbnailOffset");
|
||||
} else if (category !== null) {
|
||||
categoryTooltip.classList.remove("sbHidden");
|
||||
categoryTooltip.textContent = chrome.i18n.getMessage("category_" + category)
|
||||
|| (chrome.i18n.getMessage("preview") + " " + chrome.i18n.getMessage("category_" + category.split("preview-")[1]));
|
||||
|
||||
// There is a title now
|
||||
tooltip.classList.remove("ytp-tooltip-text-no-title");
|
||||
|
||||
// Add the correct offset for the number of titles there are
|
||||
if (titleTooltip.textContent !== "") {
|
||||
if (!tooltipTextWrapper.classList.contains("sbTooltipTwoTitleThumbnailOffset")) {
|
||||
tooltipTextWrapper.classList.add("sbTooltipTwoTitleThumbnailOffset");
|
||||
}
|
||||
} else if (!tooltipTextWrapper.classList.contains("sbTooltipOneTitleThumbnailOffset")) {
|
||||
tooltipTextWrapper.classList.add("sbTooltipOneTitleThumbnailOffset");
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
observer.observe(tooltipTextWrapper, {
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
}
|
||||
|
||||
updatePosition(parent) {
|
||||
@@ -109,6 +188,9 @@ class PreviewBar {
|
||||
return;
|
||||
}
|
||||
|
||||
this.timestamps = timestamps;
|
||||
this.types = types;
|
||||
|
||||
// to avoid rounding error resulting in width more than 100%
|
||||
duration = Math.floor(duration * 100) / 100;
|
||||
let width;
|
||||
|
||||
@@ -3,7 +3,7 @@ import SkipNoticeComponent from "./components/SkipNoticeComponent";
|
||||
|
||||
interface ContentContainer {
|
||||
(): {
|
||||
vote: (type: any, UUID: any, skipNotice?: SkipNoticeComponent) => void,
|
||||
vote: (type: any, UUID: any, category?: string, skipNotice?: SkipNoticeComponent) => void,
|
||||
dontShowNoticeAgain: () => void,
|
||||
unskipSponsorTime: (UUID: any) => void,
|
||||
sponsorTimes: SponsorTime[],
|
||||
@@ -16,7 +16,9 @@ interface ContentContainer {
|
||||
sponsorSubmissionNotice: SubmissionNotice,
|
||||
resetSponsorSubmissionNotice: () => void,
|
||||
changeStartSponsorButton: (showStartSponsor: any, uploadButtonVisible: any) => Promise<boolean>,
|
||||
previewTime: (time: number) => void
|
||||
previewTime: (time: number) => void,
|
||||
videoInfo: any,
|
||||
getRoughCurrentTime: () => number
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user