aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAjay Ramachandran <[email protected]>2021-08-17 18:25:18 -0400
committerAjay Ramachandran <[email protected]>2021-08-17 18:25:18 -0400
commit4e99754b8c651a84ec6087498e991aba65f2ebfe (patch)
tree5cbaf192fdea76346671c514bf11dea376989b04
parent9c54d141e9e8d50c5c9f67d537e132ef1159ee24 (diff)
parent422139f4748a0c9cb54fe70ee26bc1f26671f754 (diff)
downloadSponsorBlock-4e99754b8c651a84ec6087498e991aba65f2ebfe.tar.gz
SponsorBlock-4e99754b8c651a84ec6087498e991aba65f2ebfe.zip
Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements
-rw-r--r--manifest/manifest.json2
-rw-r--r--public/_locales/bg/messages.json498
-rw-r--r--public/_locales/cs/messages.json10
-rw-r--r--public/_locales/en/messages.json3
-rw-r--r--public/_locales/es/messages.json3
-rw-r--r--public/_locales/et/messages.json10
-rw-r--r--public/_locales/fi/messages.json3
-rw-r--r--public/_locales/it/messages.json7
-rw-r--r--public/_locales/ja/messages.json10
-rw-r--r--public/_locales/ko/messages.json10
-rw-r--r--public/_locales/nl/messages.json20
-rw-r--r--public/_locales/pl/messages.json13
-rw-r--r--public/_locales/pt_BR/messages.json72
-rw-r--r--public/_locales/ru/messages.json10
-rw-r--r--public/_locales/sk/messages.json14
-rw-r--r--public/_locales/sv/messages.json10
-rw-r--r--public/_locales/tr/messages.json10
-rw-r--r--public/options/options.html16
-rw-r--r--public/popup.css5
-rw-r--r--src/components/SponsorTimeEditComponent.tsx21
-rw-r--r--src/components/SubmissionNoticeComponent.tsx2
-rw-r--r--src/config.ts14
-rw-r--r--src/content.ts31
-rw-r--r--src/js-components/chat.ts7
-rw-r--r--src/messageTypes.ts8
-rw-r--r--src/options.ts16
-rw-r--r--src/popup.ts39
-rw-r--r--src/utils.ts2
28 files changed, 783 insertions, 83 deletions
diff --git a/manifest/manifest.json b/manifest/manifest.json
index 16276b7b..e0565a39 100644
--- a/manifest/manifest.json
+++ b/manifest/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_fullName__",
"short_name": "SponsorBlock",
- "version": "2.1.4",
+ "version": "2.2",
"default_locale": "en",
"description": "__MSG_Description__",
"homepage_url": "https://sponsor.ajay.app",
diff --git a/public/_locales/bg/messages.json b/public/_locales/bg/messages.json
index 78b029b4..88effad2 100644
--- a/public/_locales/bg/messages.json
+++ b/public/_locales/bg/messages.json
@@ -25,9 +25,15 @@
"Segments": {
"message": "сегменти"
},
+ "upvoteButtonInfo": {
+ "message": "Одобряване на това предложение"
+ },
"reportButtonTitle": {
"message": "Докладвай"
},
+ "reportButtonInfo": {
+ "message": "Подайте сигнал за неправилно предложение."
+ },
"Dismiss": {
"message": "Отхвърли"
},
@@ -49,6 +55,9 @@
"paused": {
"message": "На пауза"
},
+ "manualPaused": {
+ "message": "Таймерът е спрян"
+ },
"confirmMSG": {
"message": "За да редактирате или изтриете някои стойности, натиснете на \"инфо\" бутона или отворете изкачащият прозорец на добавката чрез кликване на иконата на добавката в горният ляв ъгъл."
},
@@ -58,12 +67,27 @@
"Unknown": {
"message": "Възникна грешка при подаването на Вашите спонсорски времена, моля опитайте отново по-късно."
},
+ "sponsorFound": {
+ "message": "Този видеоклип има сегменти в базата данни!"
+ },
+ "sponsor404": {
+ "message": "Не са намерени сегменти"
+ },
"sponsorStart": {
"message": "Сегментът Започва Сега"
},
"sponsorEnd": {
"message": "Сегментът Свършва Сега"
},
+ "sponsorCancel": {
+ "message": "Отказ от създаването на сегмент"
+ },
+ "noVideoID": {
+ "message": "Не е намерен видеоклип в YouTube.\nАко това е неправилно, опреснете раздела."
+ },
+ "refreshSegments": {
+ "message": "Опресняване на сегментите"
+ },
"success": {
"message": "Успешно!"
},
@@ -76,12 +100,67 @@
"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 сървър за да давате предложения!"
},
@@ -97,9 +176,319 @@
"hideButtons": {
"message": "Скриване на бутоните в YouTube Player-а"
},
+ "hideButtonsDescription": {
+ "message": "Това скрива бутоните, които се показват в плейъра на YouTube за изпращане на сегменти за пропускане."
+ },
+ "showInfoButton": {
+ "message": "Показване на бутона за информация в плейъра на YouTube"
+ },
+ "hideInfoButton": {
+ "message": "Скриване на бутона за информация в плейъра на YouTube"
+ },
+ "whatInfoButton": {
+ "message": "Това е бутонът, който отваря изскачащ прозорец в страницата на YouTube."
+ },
+ "autoHideInfoButton": {
+ "message": "Автоматично скриване на бутона за информация"
+ },
+ "hideDeleteButton": {
+ "message": "Скриване на бутона за изтриване в плейъра на YouTube"
+ },
+ "showDeleteButton": {
+ "message": "Показване на бутона за изтриване в плейъра на YouTube"
+ },
+ "whatDeleteButton": {
+ "message": "Това е бутонът в плейъра на YouTube, който ще изчисти всичките ви неизпратени сегменти за текущия видеоклип."
+ },
+ "enableViewTracking": {
+ "message": "Активиране проследяването на броя пропускания"
+ },
+ "whatViewTracking": {
+ "message": "Тази функция проследява кои сегменти сте пропуснали, за да уведоми потребителите доколко приносът им е помогнал на другите и се използва като показател заедно с положителните гласове, за да се гарантира, че спамът няма да попадне в базата данни. Разширението изпраща съобщение до сървъра всеки път, когато пропуснете сегмент. Надяваме се, че повечето хора няма да променят тази настройка, така че броят на прегледите да е точен. :)"
+ },
+ "enableViewTrackingInPrivate": {
+ "message": "Активиране проследяването на броя пропускания в раздели „Инкогнито“"
+ },
+ "enableQueryByHashPrefix": {
+ "message": "Заявка по префикс на хеш"
+ },
+ "whatQueryByHashPrefix": {
+ "message": "Вместо да се изискват сегменти от сървъра с помощта на videoID, се изпращат първите 4 знака от хеша на videoID. Този сървър ще изпрати обратно данни за всички видеоклипове с подобни хешове."
+ },
+ "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"
+ },
+ "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."
+ },
+ "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": "Код на грешката: "
+ },
+ "skip": {
+ "message": "Пропускане"
+ },
+ "skip_category": {
+ "message": "Пропускане на {0}?"
+ },
+ "skipped": {
+ "message": "Пропуснато"
+ },
+ "disableAutoSkip": {
+ "message": "Деактивиране на автоматичното пропускане"
+ },
+ "enableAutoSkip": {
+ "message": "Активиране на автоматичното пропускане"
+ },
+ "audioNotification": {
+ "message": "Звуково известие при пропускане"
+ },
+ "audioNotificationDescription": {
+ "message": "Звуковото известие при пропускане ще пуска звук всеки път, когато се пропусне сегмент. Ако е забранено (или автоматичното пропускане е деактивирано), няма да се пуска звук."
+ },
+ "showTimeWithSkips": {
+ "message": "Показване на времето с премахнати пропускания"
+ },
+ "showTimeWithSkipsDescription": {
+ "message": "Това време се показва в скоби до текущото време под лентата за прогреса. Това показва общата продължителност на видеоклипа минус всички сегменти. Това включва сегменти, маркирани само като „Показване в лентата за прогреса“."
+ },
+ "youHaveSkipped": {
+ "message": "Пропуснали сте "
+ },
+ "youHaveSaved": {
+ "message": "Спестили сте "
+ },
+ "minLower": {
+ "message": "минута"
+ },
+ "minsLower": {
+ "message": "минути"
+ },
+ "hourLower": {
+ "message": "час"
+ },
+ "hoursLower": {
+ "message": "часа"
+ },
+ "youHaveSavedTime": {
+ "message": "Спестили сте на хората"
+ },
+ "youHaveSavedTimeEnd": {
+ "message": " от живота им"
+ },
+ "statusReminder": {
+ "message": "Проверете status.sponsor.ajay.app за състоянието на сървъра."
+ },
+ "changeUserID": {
+ "message": "Импортиране/експортиране на вашия UserID"
+ },
+ "whatChangeUserID": {
+ "message": "Това трябва да се пази тайно. То е като парола и не трябва да се споделя с никого. Ако някой го притежава, той може да се представи за вас."
+ },
+ "setUserID": {
+ "message": "Задаване на UserID"
+ },
+ "userIDChangeWarning": {
+ "message": "Внимание: Промяната на UserID е постоянна. Наистина ли искате да направите това? Не забравяйте да архивирате стария си за всеки случай."
+ },
+ "createdBy": {
+ "message": "Създаден от"
+ },
"autoSkip": {
"message": "Автоматично пропускане"
},
+ "showSkipNotice": {
+ "message": "Показване на известие след пропускане на сегмент"
+ },
+ "keybindCurrentlySet": {
+ "message": ". В момента е настроено на:"
+ },
+ "supportOtherSites": {
+ "message": "Поддръжка на YouTube-сайтове на трети страни"
+ },
+ "supportOtherSitesDescription": {
+ "message": "Поддръжка на клиенти за YouTube на трети страни. За да активирате поддръжката, трябва да приемете допълнителните разрешения. Това НЕ работи в режим инкогнито в Chrome и други варианти на Chromium.",
+ "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
+ },
+ "supportedSites": {
+ "message": "Поддържани сайтове: "
+ },
+ "optionsInfo": {
+ "message": "Активиране поддръжката на Invidious, деактивиране на автоматичното пропускане, скриване на бутоните и др."
+ },
+ "addInvidiousInstance": {
+ "message": "Добавяне екземпляр на клиент на трета страна"
+ },
+ "addInvidiousInstanceDescription": {
+ "message": "Добавяне на персонализиран екземпляр. Това трябва да бъде форматирано само с домейна. Пример: invidious.ajay.app"
+ },
+ "add": {
+ "message": "Добавяне"
+ },
+ "addInvidiousInstanceError": {
+ "message": "Това е невалиден домейн. Трябва да включва само частта на домейна. Пример: invidious.ajay.app"
+ },
+ "resetInvidiousInstance": {
+ "message": "Нулиране списъка на Invidious"
+ },
+ "resetInvidiousInstanceAlert": {
+ "message": "На път сте да нулирате списъка на Invidious"
+ },
+ "currentInstances": {
+ "message": "Текущи екземпляри:"
+ },
+ "minDuration": {
+ "message": "Минимална продължителност (секунди):"
+ },
+ "minDurationDescription": {
+ "message": "Сегменти, по-кратки от зададената стойност, няма да бъдат пропускани или показвани в плейъра."
+ },
+ "skipNoticeDuration": {
+ "message": "Продължителност на известието за пропускане (секунди):"
+ },
+ "skipNoticeDurationDescription": {
+ "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": "Наистина ли искате да върнете началното състояние?"
+ },
+ "mobileUpdateInfo": {
+ "message": "m.youtube.com вече се поддържа"
+ },
+ "exportOptions": {
+ "message": "Импортиране/експортиране на всички опции"
+ },
+ "whatExportOptions": {
+ "message": "Това е цялата ви конфигурация в JSON. Това включва вашия userID, така че се уверете, че споделяте това разумно."
+ },
+ "setOptions": {
+ "message": "Задаване на опции"
+ },
+ "exportOptionsWarning": {
+ "message": "Внимание: Промяната на опциите е постоянна и може да повреди вашата инсталация. Наистина ли искате да направите това? Не забравяйте да архивирате старите си за всеки случай."
+ },
+ "incorrectlyFormattedOptions": {
+ "message": "Този JSON не е форматиран правилно. Вашите опции не са променени."
+ },
+ "confirmNoticeTitle": {
+ "message": "Изпращане на сегмента"
+ },
+ "submit": {
+ "message": "Изпращане"
+ },
+ "cancel": {
+ "message": "Отказ"
+ },
+ "delete": {
+ "message": "Изтриване"
+ },
+ "preview": {
+ "message": "Преглед"
+ },
+ "unsubmitted": {
+ "message": "Неизпратен"
+ },
+ "inspect": {
+ "message": "Изследване"
+ },
+ "edit": {
+ "message": "Редактиране"
+ },
+ "copyDebugInformation": {
+ "message": "Копиране на информацията за отстраняване на грешки в клипборда"
+ },
+ "copyDebugInformationFailed": {
+ "message": "Неуспешно записване в клипборда"
+ },
+ "copyDebugInformationOptions": {
+ "message": "Копира информацията в клипборда, за да се предостави на разработчика при възникване на грешка или когато разработчикът поиска това. Деликатната информация като вашия user ID, канали в белия списък и потребителски адрес на сървъра са премахнати. Съдържа се обаче информация като вашия потребителски агент, браузър, операционна система и номер на версия на разширението. "
+ },
+ "copyDebugInformationComplete": {
+ "message": "Информацията за отстраняване на грешки е копирана в клипборда. Чувствайте се свободни да премахнете всяка информация, която предпочитате да не споделяте. Запазете това в текстов файл или го поставете в доклада за грешки."
+ },
+ "theKey": {
+ "message": "Клавишът"
+ },
+ "keyAlreadyUsed": {
+ "message": "е обвързан с друго действие. Моля, изберете друг клавиш."
+ },
"to": {
"message": "до",
"description": "Used between segments. Example: 1:20 to 1:30"
@@ -107,6 +496,9 @@
"category_sponsor": {
"message": "Спонсорство"
},
+ "category_sponsor_description": {
+ "message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."
+ },
"category_selfpromo": {
"message": "Неплатена/Само-реклама"
},
@@ -119,18 +511,36 @@
"category_interaction_description": {
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или заради нещо специфично, трябва да е под \"само-реклама\"."
},
+ "category_interaction_short": {
+ "message": "Напомняне за взаимодействие"
+ },
"category_intro": {
"message": "Пауза/Начална анимация"
},
+ "category_intro_description": {
+ "message": "Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация."
+ },
+ "category_intro_short": {
+ "message": "Антракт"
+ },
"category_outro": {
"message": "Крайни картички/Заслуги"
},
+ "category_outro_description": {
+ "message": "Заслуги или когато се показват крайните карти на YouTube. Не за заключения с информация."
+ },
"category_preview": {
"message": "Предварително изявление/Обобщение"
},
+ "category_preview_description": {
+ "message": "Бързо обобщение на предишни епизоди или преглед на това, което предстои по-късно в текущия видеоклип. Предназначен за монтирани заедно клипове, а не за речеви обобщения."
+ },
"category_music_offtopic": {
"message": "Музика: Част без музика"
},
+ "category_music_offtopic_description": {
+ "message": "Само за използване в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория."
+ },
"category_music_offtopic_short": {
"message": "Без музика"
},
@@ -149,6 +559,9 @@
"showOverlay": {
"message": "Показване в seek лентата"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Автоматично пропускане на всички сегменти, когато има сегмент без музика"
+ },
"colorFormatIncorrect": {
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен hex код с \"#\" в началото."
},
@@ -166,21 +579,106 @@
"message": "Метод за пропускане",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
+ "enableTestingServer": {
+ "message": "Активиране на сървъра за бета тестване"
+ },
+ "whatEnableTestingServer": {
+ "message": "Вашите предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър. Използвайте това само за тестване."
+ },
+ "testingServerWarning": {
+ "message": "Всички предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър, докато се свързвате с тестовия сървър. Не забравяйте да деактивирате това, когато искате да правите реални предложения."
+ },
+ "bracketNow": {
+ "message": "(Сега)"
+ },
+ "moreCategories": {
+ "message": "Още категории"
+ },
+ "chooseACategory": {
+ "message": "Изберете категория"
+ },
+ "enableThisCategoryFirst": {
+ "message": "За да изпратите сегменти с категория „{0}“, трябва да я активирате от опциите. Ще бъдете пренасочени към опциите сега.",
+ "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
+ },
+ "youMustSelectACategory": {
+ "message": "Трябва да изберете категория за всички сегменти, които изпращате!"
+ },
+ "bracketEnd": {
+ "message": "(Край)"
+ },
+ "hiddenDueToDownvote": {
+ "message": "скрито: глас против"
+ },
+ "hiddenDueToDuration": {
+ "message": "скрито: твърде кратко"
+ },
+ "channelDataNotFound": {
+ "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
+ "message": "ID на канала все още не е зареден. Ако използвате вграден видеоклип, опитайте вместо това да използвате началната страница на YouTube. Това може да бъде причинено и от промени в оформлението на YouTube, ако мислите така, направете коментар тук:"
+ },
+ "videoInfoFetchFailed": {
+ "message": "Изглежда, че нещо блокира способността на SponsorBlock да получава видео данни. Моля, вижте https://github.com/ajayyy/SponsorBlock/issues/741 за повече информация."
+ },
+ "youtubePermissionRequest": {
+ "message": "Изглежда, че SponsorBlock не може да достигне API на YouTube. За да поправите това, приемете подканата за разрешение, която ще се появи след това, изчакайте няколко секунди и след това презаредете страницата."
+ },
+ "acceptPermission": {
+ "message": "Даване на разрешение"
+ },
+ "permissionRequestSuccess": {
+ "message": "Искането за разрешение е успешно!"
+ },
+ "permissionRequestFailed": {
+ "message": "Искането за разрешение не бе успешно, натиснахте ли Отказ?"
+ },
+ "adblockerIssueWhitelist": {
+ "message": "Ако не можете да разрешите това, деактивирайте настройката „Принудителна проверка на канала преди пропускане“, тъй като SponsorBlock не може да извлече информацията за канала за този видеоклип"
+ },
+ "forceChannelCheck": {
+ "message": "Принудителна проверка на канала преди пропускане"
+ },
+ "whatForceChannelCheck": {
+ "message": "По подразбиране ще пропусне сегменти веднага, преди дори да разбере какъв е каналът. По подразбиране някои сегменти в началото на видеоклипа може да бъдат пропуснати в канали от белия списък. Активирането на тази опция ще предотврати това, но при всички пропускания ще има леко забавяне, тъй като получаването на ID на канала може да отнеме известно време. Това забавяне може да бъде незабележимо, ако имате бърз интернет."
+ },
+ "forceChannelCheckPopup": {
+ "message": "Помислете за активиране на „Принудителна проверка на канала преди пропускане“"
+ },
"downvoteDescription": {
"message": "Грешно/Неправилно Време"
},
"incorrectCategory": {
"message": "Грешна Категория"
},
+ "nonMusicCategoryOnMusic": {
+ "message": "Това видео е категоризирано като музика. Сигурни ли сте, че това има спонсор? Ако това всъщност е „Немузикален сегмент“, отворете опциите на разширението и активирайте тази категория. След това можете да изпратите този сегмент като „Немузикален“ вместо като спонсор. Моля, прочетете указанията, ако сте объркани."
+ },
"multipleSegments": {
"message": "Няколко Сегмента"
},
"guidelines": {
"message": "Правила"
},
+ "readTheGuidelines": {
+ "message": "Прочетете указанията!",
+ "description": "Show the first time they submit or if they are \"high risk\""
+ },
"categoryUpdate1": {
"message": "Категориите са тук!"
},
+ "categoryUpdate2": {
+ "message": "Отворете опциите за пропускане на въведения, заключения, продажба на стоки и т.н."
+ },
+ "help": {
+ "message": "Помощ"
+ },
+ "experiementOptOut": {
+ "message": "Отказ от всички бъдещи експерименти",
+ "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
+ },
+ "hideForever": {
+ "message": "Скриване завинаги"
+ },
"warningChatInfo": {
"message": "Получихте предупреждение и временно не можете да изпращате сегменти. Това означава, че забелязахме, че допускате някои често срещани грешки, които не са злонамерени, и просто искаме да изясним правилата. Можете също да се присъедините към този чат с помощта на discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
},
diff --git a/public/_locales/cs/messages.json b/public/_locales/cs/messages.json
index 22184ce4..d8a24109 100644
--- a/public/_locales/cs/messages.json
+++ b/public/_locales/cs/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Zobrazit v liště"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Automaticky přeskočit všechny segmenty, když je ve videu nehudební segment"
+ },
"colorFormatIncorrect": {
"message": "Vaše barva má nesprávný formát. Měl by to být 3 nebo 6 znaků dlouhý HEX kód s křížkem na začátku."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Skrýt napořád"
+ },
+ "warningChatInfo": {
+ "message": "Dostali jste varování a nemůžete dočasně přidávat segmenty. To znamená, že jsme si všimli, že děláte běžné chyby, které nejsou škodlivé, jen chceme vyjasnit pravidla. Také se můžete připojit do tohoto chatu pomocí discord.gg/SponsorBlock nebo matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Hlas zamítnut kvůli varování. Klikněte pro otevření chatu pro vyřešení, nebo se vraťte později, až budete mít čas.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json
index 4106d0ff..6494a9a4 100644
--- a/public/_locales/en/messages.json
+++ b/public/_locales/en/messages.json
@@ -578,6 +578,9 @@
"showOverlay_POI": {
"message": "Show In Seek Bar"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Auto skip all segments when there is a non-music segment"
+ },
"colorFormatIncorrect": {
"message": "Your color is formatted incorrectly. It should be a 3 or 6 digit hex code with a number sign at the beginning."
},
diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json
index f6656f9b..d4681cdf 100644
--- a/public/_locales/es/messages.json
+++ b/public/_locales/es/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Mostrar en la barra de búsqueda"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Saltar automáticamente todos los segmentos cuando hay un segmento no musical"
+ },
"colorFormatIncorrect": {
"message": "Su color está formateado incorrectamente. Debería ser un código hexadecimal de 3 o 6 dígitos con un signo numérico al principio."
},
diff --git a/public/_locales/et/messages.json b/public/_locales/et/messages.json
index c27ae139..b0982c31 100644
--- a/public/_locales/et/messages.json
+++ b/public/_locales/et/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Kuva mängija ajaribal"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Jäta automaatselt kõik segmendid vahele, kui eksisteerib mitte-muusika segment"
+ },
"colorFormatIncorrect": {
"message": "Sinu värv on sobimatult vormistatud. See peaks olema 3- või 6-numbriline 16-kümmendsüsteemis kood, arvu ees trellid."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Peida igaveseks"
+ },
+ "warningChatInfo": {
+ "message": "Sa said hoiatuse ning ei saa ajutiselt segmente saata. See tähendab, et me leidsime sind tegemast teatud sagedasi, mitte-pahatahtlikke vigu, ning soovime sulle meie reegleid täpsustada (inglise keeles). Sa võid selle vestlusega liituda ka discord.gg/SponsorBlock või matrix.to/#/+sponsor:ajay.app kaudu."
+ },
+ "voteRejectedWarning": {
+ "message": "Hääletus hoiatuse tõttu tagasilükatud. Klõpsa, et avada selle lahendamiseks vestlus või tule hiljem tagasi, kui aega saad.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/fi/messages.json b/public/_locales/fi/messages.json
index 25f41cba..a31c3946 100644
--- a/public/_locales/fi/messages.json
+++ b/public/_locales/fi/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Näytä liukusäätimessä"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Ohita kaikki segmentit automaattisesti, kun videossa on \"Musiikiton\" segmentti"
+ },
"colorFormatIncorrect": {
"message": "Väriformaattisi on muotoiltu väärin. Sen pitäisi olla 3 tai 6 numeroinen hex-koodi, jossa on # alussa."
},
diff --git a/public/_locales/it/messages.json b/public/_locales/it/messages.json
index cf95dc5f..8047413f 100644
--- a/public/_locales/it/messages.json
+++ b/public/_locales/it/messages.json
@@ -675,5 +675,12 @@
},
"hideForever": {
"message": "Nascondi per sempre"
+ },
+ "warningChatInfo": {
+ "message": "Hai ricevuto un ammonimento and non puoi inviare segmenti temporaneamente. Ciò significa che abbiamo notato che stavi commettendo alcuni errori comuni senza scopo malevolo, e vogliamo che tu ricontrollassi le regole. Puoi anche partecipare a questa chat su discord.gg/SponsorBlock o matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Voto rifiutato a causa di un ammonimento. Clicca per aprire una chat per risolverlo, oppure torna dopo quando hai tempo.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json
index 6fb3a8e9..daef2954 100644
--- a/public/_locales/ja/messages.json
+++ b/public/_locales/ja/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "シークバーに表示"
},
+ "autoSkipOnMusicVideos": {
+ "message": "非音楽区域がある場合,全区域を自動的に飛び越す"
+ },
"colorFormatIncorrect": {
"message": "カラーコードの書式が間違っています。 #から始まる3桁または6桁の16進数コードでなければなりません。"
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "二度と表示しない"
+ },
+ "warningChatInfo": {
+ "message": "警告のため,区域の送信が一時的に禁止されています。これは利用者さまが間違いを犯されているというこちらどもの判断ではありますが,この間違いが悪意あるものとは思っておりません。単に,利用者さまに区域送信における規則を知っていただきたいだけです。連絡先: discord.gg/SponsorBlock,matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "警告により投票が拒否されました。クリックして運営に連絡するか,少し時間を置いてからやりなおしてください。",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/ko/messages.json b/public/_locales/ko/messages.json
index c056502a..b5ed93c8 100644
--- a/public/_locales/ko/messages.json
+++ b/public/_locales/ko/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "재생 시간 바 표시"
},
+ "autoSkipOnMusicVideos": {
+ "message": "음악이 아닌 구간이 있을 때는 모든 구간 자동 건너뛰기"
+ },
"colorFormatIncorrect": {
"message": "올바르지 않은 색상 코드입니다. 색상 코드는 샵 (#) 기호로 시작하여 3자리 또는 6자리의 16진수로 구성되어야 합니다."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "다시 보지 않음"
+ },
+ "warningChatInfo": {
+ "message": "현재 귀하가 악의적이지 않은 일반적인 실수를 저지르고 있음을 발견했습니다. 이에 따라 경고 조치가 내려져 일시적으로 구간을 제출할 수 없게 되었습니다. 저희는 단지 규칙을 명확히 전달하고자 합니다. discord.gg/SponsorBlock 또는 matrix.to/#/+sponsor:ajay.app 링크를 통해 대화에 참여할 수도 있습니다."
+ },
+ "voteRejectedWarning": {
+ "message": "경고로 인해 투표가 거부되었습니다. 클릭하여 대화로 해결하거나, 나중에 시간이 나면 다시 오세요.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/nl/messages.json b/public/_locales/nl/messages.json
index 9ed0643e..6dac480a 100644
--- a/public/_locales/nl/messages.json
+++ b/public/_locales/nl/messages.json
@@ -26,13 +26,13 @@
"message": "segmenten"
},
"upvoteButtonInfo": {
- "message": "Stemmen op deze indiening"
+ "message": "Stemmen op deze inzending"
},
"reportButtonTitle": {
"message": "Rapporteren"
},
"reportButtonInfo": {
- "message": "Deze indiening als onjuist rapporteren."
+ "message": "Deze inzending als onjuist rapporteren."
},
"Dismiss": {
"message": "Verwerpen"
@@ -140,7 +140,7 @@
"message": "Indienen"
},
"submissionEditHint": {
- "message": "Sectiebewerking verschijnt nadat u op verzenden hebt geklikt",
+ "message": "Sectiebewerking verschijnt nadat u op indienen hebt geklikt",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
@@ -204,7 +204,7 @@
"message": "Bijhouden van het aantal keren overslaan inschakelen"
},
"whatViewTracking": {
- "message": "Deze functie houdt bij welke segmenten u heeft overgeslagen om gebruikers te laten weten hoezeer hun indiening anderen heeft geholpen en wordt samen met upvotes als meetwaarde gebruikt om ervoor te zorgen dat spam niet in de database terechtkomt. De extensie stuurt telkens wanneer u een segment overslaat een bericht naar de server. Hopelijk veranderen de meeste mensen deze instelling niet zodat de weergavenummers accuraat zijn. :)"
+ "message": "Deze functie houdt bij welke segmenten u heeft overgeslagen om gebruikers te laten weten hoezeer hun inzending anderen heeft geholpen en wordt samen met upvotes als meetwaarde gebruikt om ervoor te zorgen dat spam niet in de database terechtkomt. De extensie stuurt telkens wanneer u een segment overslaat een bericht naar de server. Hopelijk veranderen de meeste mensen deze instelling niet zodat de weergavenummers accuraat zijn. :)"
},
"enableViewTrackingInPrivate": {
"message": "Bijhouden van het aantal keren overslaan inschakelen in privé-/incognito-tabbladen"
@@ -251,7 +251,7 @@
"message": "Sneltoets instellen voor begin/einde van segment"
},
"setSubmitKeybind": {
- "message": "Sneltoets instellen voor indienen"
+ "message": "Sneltoets instellen voor inzending"
},
"keybindDescription": {
"message": "Selecteer een toets door hem in te drukken"
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Weergeven in tijdbalk"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Automatisch alle segmenten overslaan wanneer er een niet-muziek-segment is"
+ },
"colorFormatIncorrect": {
"message": "Uw kleur is verkeerd geformatteerd. Het moet een hexadecimale code van 3 of 6 cijfers zijn met een hekje aan het begin."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Voor altijd verbergen"
+ },
+ "warningChatInfo": {
+ "message": "U heeft een waarschuwing gekregen en kunt tijdelijk geen segmenten indienen. Dit betekent dat we gemerkt hebben dat u een aantal veelvoorkomende fouten maakt die niet kwaadaardig zijn, en we willen gewoon de regels verduidelijken. U kunt ook deelnemen aan deze chat via discord.gg/SponsorBlock of matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Stem geweigerd vanwege een waarschuwing. Klik om een chat te openen om het op te lossen, of kom later terug als u tijd hebt.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json
index ec1e4be5..9af7665b 100644
--- a/public/_locales/pl/messages.json
+++ b/public/_locales/pl/messages.json
@@ -85,6 +85,9 @@
"noVideoID": {
"message": "Nie znaleziono filmu YouTube.\nJeżeli to błąd, odśwież stronę."
},
+ "refreshSegments": {
+ "message": "Odśwież segmenty"
+ },
"success": {
"message": "Sukces!"
},
@@ -556,6 +559,9 @@
"showOverlay": {
"message": "Pokaż na pasku"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Automatycznie pomiń wszystkie segmenty, gdy istnieje segment niemuzyczny"
+ },
"colorFormatIncorrect": {
"message": "Nieprawidłowy format koloru. Powinien to być zapis szesnastkowy (heksadecymalny) składający się z 3 lub 6 znaków poprzedzonych kratką (#)."
},
@@ -672,5 +678,12 @@
},
"hideForever": {
"message": "Schowaj na zawsze"
+ },
+ "warningChatInfo": {
+ "message": "Otrzymałeś ostrzeżenie i nie możesz tymczasowo przesłać segmentów. Oznacza to, że zauważyliśmy, że popełniałeś pewne pospolite błędy, które nie są złośliwe i po prostu chcemy wyjaśnić zasady. Możesz również dołączyć do tego czatu używając discord.gg/SponsorBlock lub matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Głosowanie odrzucone z powodu ostrzeżenia. Kliknij, aby otworzyć czat w celu rozwiązania problemu lub wróć później, gdy będziesz miał czas.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/pt_BR/messages.json b/public/_locales/pt_BR/messages.json
index 46203fe9..67a9979c 100644
--- a/public/_locales/pt_BR/messages.json
+++ b/public/_locales/pt_BR/messages.json
@@ -4,7 +4,7 @@
"description": "Name of the extension."
},
"Description": {
- "message": "Pule patrocinadores, pedidos para se inscrever e mais nos vídeos do YouTube. Reporte patrocinadores nos vídeos que você assistir para economizar o tempo dos outros.",
+ "message": "Pule patrocinadores, pedidos para se inscrever, e outros nos vídeos do YouTube. Reporte patrocinadores nos vídeos que você assistir para economizar o tempo dos outros.",
"description": "Description of the extension."
},
"400": {
@@ -74,10 +74,10 @@
"message": "Nenhum segmento encontrado"
},
"sponsorStart": {
- "message": "O segmento começa agora"
+ "message": "O Segmento Começa Agora"
},
"sponsorEnd": {
- "message": "O segmento termina agora"
+ "message": "O Segmento Termina Agora"
},
"sponsorCancel": {
"message": "Cancelar Criação de Segmento"
@@ -140,7 +140,7 @@
"message": "Enviar"
},
"submissionEditHint": {
- "message": "A edição da seção aparecerá depois que você clicar em enviar",
+ "message": "A edição da seção aparecerá após você clicar em enviar",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
@@ -189,7 +189,7 @@
"message": "Este é o botão que abre o popup na pagina do Youtube."
},
"autoHideInfoButton": {
- "message": "Esconder automaticamente botão de informação"
+ "message": "Esconder Automaticamente o Botão de Informação"
},
"hideDeleteButton": {
"message": "Esconder botão de Apagar no player do Youtube"
@@ -201,31 +201,31 @@
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
},
"enableViewTracking": {
- "message": "Ativar contador de segmentos pulados"
+ "message": "Ativar Contador de Segmentos Pulados"
},
"whatViewTracking": {
- "message": "Este recurso controla quais segmentos você pulou para permitir que os usuários saibam o quanto a submissão deles ajudou outros e é usado como métrica, juntamente com votos positivos para garantir que spam não entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espera-se que a maioria das pessoas não mude essa configuração, para que os números de exibição estejam corretos. :)"
+ "message": "Este recurso controla quais segmentos você pulou para permitir que os usuários saibam o quanto a submissão deles ajudou outros e foi usada como métrica, juntamente com votos positivos para garantir que nenhum spam entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espera-se que a maioria das pessoas não mude essa configuração, para que os números de exibição estejam corretos. :)"
},
"enableViewTrackingInPrivate": {
- "message": "Ativar Pular Contagem de Rastreamento em abas Privadas/Incógnito"
+ "message": "Ativar Pular Contagem de Rastreamento em Abas Privadas/Incógnito"
},
"enableQueryByHashPrefix": {
"message": "Consulta Por Prefixo Hash"
},
"whatQueryByHashPrefix": {
- "message": "Em vez de solicitar segmentos do servidor usando o videoID, os 4 primeiros caracteres do hash do videoID foram enviados. Este servidor irá enviar dados de volta para todos os vídeos com hashes similares."
+ "message": "Em vez de solicitar segmentos do servidor usando o videoID, os 4 primeiros caracteres do hash do videoID foram enviados. Este servidor enviará dados de volta para todos os vídeos com hashes similares."
},
"enableRefetchWhenNotFound": {
"message": "Recuperar Segmentos Em Novos Vídeos"
},
"whatRefetchWhenNotFound": {
- "message": "Se o vídeo for novo e não houver segmentos encontrados, continuaremos buscando enquanto você assiste."
+ "message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos buscando enquanto você assiste."
},
"showNotice": {
"message": "Mostrar notificação outra vez"
},
"longDescription": {
- "message": "O SponsorBlock permite que você pule patrocinadores, introduções, outros, lembretes de inscrição e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de crowdsourcing que permite enviar o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções que não são de música dos vídeos de música.",
+ "message": "O SponsorBlock permite que você pule patrocinadores, introduções, créditos finais, lembretes de inscrição, e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de crowdsourcing que permite enviar a qualquer um o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções que não são de música dos vídeos de música.",
"description": "Full description of the extension on the store pages."
},
"website": {
@@ -297,7 +297,7 @@
"message": "Notificação de áudio ao pular"
},
"audioNotificationDescription": {
- "message": "A notificação de áudio ao pular irá tocar um som sempre que um segmento for ignorado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."
+ "message": "A notificação de áudio ao pular irá tocar um som sempre que um segmento for pulado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."
},
"showTimeWithSkips": {
"message": "Mostrar tempo com pulos removidos"
@@ -351,16 +351,16 @@
"message": "Pular automaticamente"
},
"showSkipNotice": {
- "message": "Mostrar aviso após um segmento ser ignorado"
+ "message": "Mostrar Aviso Após um Segmento Ser Ignorado"
},
"keybindCurrentlySet": {
"message": ". Atualmente, está definido para:"
},
"supportOtherSites": {
- "message": "Suporte a Sites do YouTube de terceiros"
+ "message": "Suporte a Sites do YouTube de Terceiros"
},
"supportOtherSitesDescription": {
- "message": "Apoie clientes de terceiros do YouTube. Para habilitar o suporte, você deve aceitar as permissões extras. Isso NÃO funciona em incógnito no Chrome e outras variantes do Chromium.",
+ "message": "Suporte a clientes de terceiros do YouTube. Para habilitar o suporte, você deve aceitar as permissões extras. Isso NÃO funciona em incógnito no Chrome e outras variantes do Chromium.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
@@ -373,7 +373,7 @@
"message": "Adicionar Instância de Cliente de Terceiros"
},
"addInvidiousInstanceDescription": {
- "message": "Adicione uma instância personalizada. Isso deve ser formatado com APENAS o domínio. Exemplo: invidious.ajay.app"
+ "message": "Adicionar uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app"
},
"add": {
"message": "Adicionar"
@@ -400,7 +400,7 @@
"message": "Duração do aviso prévio de pular (segundos):"
},
"skipNoticeDurationDescription": {
- "message": "O aviso de pular ficará na tela por pelo menos este tempo. Para o pular manual, pode ser visível por mais tempo."
+ "message": "O aviso de pular ficará na tela por pelo menos este tempo. Para o pulo manual, pode ser visível por mais tempo."
},
"shortCheck": {
"message": "A seguinte submissão é mais curta do que sua opção de duração mínima. Isto significa que já foi enviada e que está sendo ignorada devido a esta opção. Tem certeza que deseja enviar mesmo assim?"
@@ -497,19 +497,19 @@
"message": "Patrocinador"
},
"category_sponsor_description": {
- "message": "Promoção paga, indicações pagas e anúncios diretos. Não para auto-promoção ou mensagens grátis para causas/criadores/websites/produtos que eles gostam."
+ "message": "Promoção paga, referências pagas e anúncios diretos. Não deve ser usado para Auto promoção ou mensagens grátis para causas/criadores/sites/produtos que eles gostam."
},
"category_selfpromo": {
"message": "Não-pago/Auto promoção"
},
"category_selfpromo_description": {
- "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."
+ "message": "Similar a \"patrocinador\", mas para auto promoções e segmentos não-pagos. Isso inclui seções sobre vendas, doações ou informações sobre com quem colaboraram."
},
"category_interaction": {
"message": "Lembrete de interação (inscrever-se)"
},
"category_interaction_description": {
- "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."
+ "message": "Quando houver um pequeno lembrete para curtir, inscrever-se ou segui-los no meio do conteúdo. Se é longo ou sobre algo em específico, deveria ser sob Não-pago/Auto promoção."
},
"category_interaction_short": {
"message": "Lembrete de interação"
@@ -539,7 +539,7 @@
"message": "Música: Seção sem música"
},
"category_music_offtopic_description": {
- "message": "Para uso em vídeos musicais somente. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria."
+ "message": "Apenas para uso em vídeos musicais. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria."
},
"category_music_offtopic_short": {
"message": "Não musical"
@@ -559,8 +559,11 @@
"showOverlay": {
"message": "Mostrar barra de progresso"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Pular automaticamente todos os segmentos quando há um segmento que não é música"
+ },
"colorFormatIncorrect": {
- "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."
+ "message": "Sua cor está formatada incorretamente. Deve ser um código hexadecimal de 3 ou 6 dígitos com uma cerquilha (hashtag) no início."
},
"previewColor": {
"message": "Cor Não Enviada",
@@ -595,7 +598,7 @@
"message": "Selecione uma Categoria"
},
"enableThisCategoryFirst": {
- "message": "Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-lo nas opções. Você será redirecionado para as opções agora.",
+ "message": "Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-la nas opções. Você será redirecionado para as opções agora.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": {
@@ -612,13 +615,13 @@
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
- "message": "ID do canal ainda não foi carregado. Se você estiver usando um vídeo embutido, tente usar a página inicial do YouTube. Isso também pode ser causado por mudanças no layout do YouTube, se você achar que este é o caso, faça um comentário aqui:"
+ "message": "O ID do canal ainda não foi carregado. Se você estiver usando um vídeo embutido, tente usar a página inicial do YouTube. Isso também pode ser causado por mudanças no layout do YouTube, se você achar que este é o caso, faça um comentário aqui:"
},
"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."
},
"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."
+ "message": "Parece que o SponsorBlock não foi capaz 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"
@@ -627,19 +630,19 @@
"message": "Solicitação de permissão bem-sucedida!"
},
"permissionRequestFailed": {
- "message": "Falha na solicitação de permissão. Você clicou em negar?"
+ "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"
},
"forceChannelCheck": {
- "message": "Forçar verificação do canal antes de pular"
+ "message": "Forçar Verificação do Canal Antes de Pular"
},
"whatForceChannelCheck": {
- "message": "Por padrão, isso pulará os segimentos imediatamente mesmo antes de saber qual é o canal. Por padrão, alguns segimentos no inicio do video podem ser ignorados nos canais da lista branca. Habilitar esta opção evitará isso, mas irá fazer com que todos os saltos tenham um ligeiro atraso, já que obter o channelID pode levar algum tempo. Este atraso pode não ser perceptível se você tiver internet rápida."
+ "message": "Por padrão, isso pulará os seguimentos imediatamente, mesmo antes de saber qual é o canal. Por padrão, alguns seguimentos no inicio do vídeo podem ser ignorados nos canais da lista branca. Habilitar esta opção evitará isso, mas fará com que todos os pulos tenham um ligeiro atraso, já que obter o channelID pode levar algum tempo. Este atraso pode não ser perceptível se você tiver internet rápida."
},
"forceChannelCheckPopup": {
- "message": "Considere ativar a 'forçar verificação de canal antes de pular\""
+ "message": "Considere Ativar a \"Forçar Verificação de Canal Antes de Pular\""
},
"downvoteDescription": {
"message": "Tempo errado ou incorreto"
@@ -648,7 +651,7 @@
"message": "Categoria errada"
},
"nonMusicCategoryOnMusic": {
- "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."
+ "message": "Este vídeo é categorizado como música. Tem certeza de 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": "Múltiplos segmentos"
@@ -664,7 +667,7 @@
"message": "As categorias estão aqui!"
},
"categoryUpdate2": {
- "message": "Abra as opções para ignorar as introduções, outros, promoção de mercadoria, etc."
+ "message": "Abra as opções para ignorar as introduções, créditos finais, promoção de mercadoria, etc."
},
"help": {
"message": "Ajuda"
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Ocultar para sempre"
+ },
+ "warningChatInfo": {
+ "message": "Você recebeu um aviso e temporariamente não poderá enviar segmentos. Isso significa que notamos que você cometeu alguns erros comuns que não são maliciosos, e queremos apenas clarificar as regras. Você também pode participar desse chat usando discord.gg/SponsorBlock ou matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Voto rejeitado devido a um aviso. Clique para abrir um chat para resolvê-lo, ou volte mais tarde quando tiver tempo.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json
index c15dda32..31fdf63d 100644
--- a/public/_locales/ru/messages.json
+++ b/public/_locales/ru/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Показывать в полосе прокрутки"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Пропускать все сегменты автоматически при наличии сегмента без музыки"
+ },
"colorFormatIncorrect": {
"message": "Вы ввели цвет в неправильном формате. Это должно быть 3-х или 6-ти значное шестнадцатеричное число с символом # в начале."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Скрыть навсегда"
+ },
+ "warningChatInfo": {
+ "message": "Вы получили предупреждение и временно не можете отправлять сегменты. Мы заметили, что вы совершали распространенные ошибки, которые не являются злонамеренными, и просто хотим уточнить для вас правила. Вы также можете присоединиться к нашему чату, используя discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Голосование отклонено из-за предупреждения. Нажмите, чтобы открыть чат, где вы можете решить проблему, или вернитесь, когда у вас будет время.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/sk/messages.json b/public/_locales/sk/messages.json
index 2bd42ade..6bc11d95 100644
--- a/public/_locales/sk/messages.json
+++ b/public/_locales/sk/messages.json
@@ -23,7 +23,7 @@
"message": "segment"
},
"Segments": {
- "message": "segmenty"
+ "message": "segmentov"
},
"upvoteButtonInfo": {
"message": "Hlasovať pre tento príspevok"
@@ -315,7 +315,7 @@
"message": "minúta"
},
"minsLower": {
- "message": "minúty"
+ "message": "minút"
},
"hourLower": {
"message": "hodina"
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Zobraziť v časovej lište"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Automaticky preskočiť všetky segmenty ak neexistuje segment bez hudby"
+ },
"colorFormatIncorrect": {
"message": "Vaša farba je nesprávne naformátovaná. Mal by to byť 3 alebo 6-miestny hexadecimálny kód so znakom čísla na začiatku."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Navždy skryť"
+ },
+ "warningChatInfo": {
+ "message": "Dostali ste varovanie a nemôžete tak dočasne odosielať segmenty. To znamená, že sme si všimli, že ste spravili nejaké chyby, ktoré nie sú myslené zle, a chceme Vám len objasniť pravidlá. Môžete sa pripojiť do konverzácie pomocou discord.gg/SponsorBlock alebo matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Hlasovanie bolo zamietnuté kvôli varovaniu. Kliknite pre otvorenie chatu, aby ste ho vyriešili, alebo sa vrátťe až budete mať čas.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/sv/messages.json b/public/_locales/sv/messages.json
index 12d3f6b1..7ff4eda4 100644
--- a/public/_locales/sv/messages.json
+++ b/public/_locales/sv/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Visa i sökfältet"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Hoppa över alla segment automatiskt när det finns ett icke-musiksegment"
+ },
"colorFormatIncorrect": {
"message": "Din färg är felaktigt formaterad. Det ska vara en 3- eller 6-siffrig hex-kod med en siffra i början."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Dölj för alltid"
+ },
+ "warningChatInfo": {
+ "message": "Du har fått en tillfällig varning och kan inte skicka in segment. Detta innebär att vi har upptäckt att några vanliga misstag är gjorda som inte är uppsåtliga och vi vill bara klargöra reglerna. Du kan också gå med i den här chatten genom att använda discord.gg/SponsorBlock eller matrix.to/#/+sponsor:ajay.app"
+ },
+ "voteRejectedWarning": {
+ "message": "Rösten avvisades på grund av en varning. Klicka för att öppna ett chattfönster för att lösa problemet eller kom tillbaka senare när du har tid.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/_locales/tr/messages.json b/public/_locales/tr/messages.json
index 27b190d5..cffea9d2 100644
--- a/public/_locales/tr/messages.json
+++ b/public/_locales/tr/messages.json
@@ -559,6 +559,9 @@
"showOverlay": {
"message": "Arama Çubuğunda Göster"
},
+ "autoSkipOnMusicVideos": {
+ "message": "Müzik olmayan kısım varsa tüm kısımları otomatik atla"
+ },
"colorFormatIncorrect": {
"message": "Renginiz yanlış biçimlendirilmiştir. Başında bir kare işareti bulunan 3 veya 6 basamaklı bir onaltılık kod olmalıdır."
},
@@ -675,5 +678,12 @@
},
"hideForever": {
"message": "Asla gösterme"
+ },
+ "warningChatInfo": {
+ "message": "Bir uyarı aldınız ve geçici bir süreliğine kısım gönderemeyeceksiniz. Sizin kısım göndermede zararlı olmayan bazı hatalar yaptığınızı belirledik ve size kuralları açıklamak istiyoruz. Bu sohbete discord.gg/SponsorBlock veya matrix.to/#/+sponsor:ajay.app üzerinden de katılabilirsiniz"
+ },
+ "voteRejectedWarning": {
+ "message": "Bir uyarı nedeniyle oy reddedildi. Çözüm bulmak için buraya tıklayarak bir sohbet açın veya daha sonra vaktiniz olduğunda uğrayın.",
+ "description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
}
}
diff --git a/public/options/options.html b/public/options/options.html
index 405b5de7..52bce8e2 100644
--- a/public/options/options.html
+++ b/public/options/options.html
@@ -29,6 +29,22 @@
</div>
+ <div option-type="toggle" sync-option="autoSkipOnMusicVideos">
+ <label class="switch-container">
+ <label class="switch">
+ <input type="checkbox" checked>
+ <span class="slider round"></span>
+ </label>
+ <div class="switch-label">
+ __MSG_autoSkipOnMusicVideos__
+ </div>
+ </label>
+
+ <br/>
+ <br/>
+ <br/>
+ </div>
+
<br/>
<br/>
diff --git a/public/popup.css b/public/popup.css
index 444039dc..4398eaa4 100644
--- a/public/popup.css
+++ b/public/popup.css
@@ -318,6 +318,11 @@ label>p, #disableExtension>p, #usernameValue, #usernameElement > div > p,#sponso
transform: rotate(45deg);
}
+@keyframes rotate {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
.SBWhitelistIconContainer, button#optionsButton {
display: flex;
align-items: center;
diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx
index 8044b920..c133883f 100644
--- a/src/components/SponsorTimeEditComponent.tsx
+++ b/src/components/SponsorTimeEditComponent.tsx
@@ -177,13 +177,14 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
{this.getCategoryOptions()}
</select>
- <img id={"sponsorTimeCategoriesHelpButton" + this.idSuffix}
- className="helpButton"
- src={chrome.extension.getURL("icons/help.svg")}
- title={chrome.i18n.getMessage("categoryGuidelines")}
- onClick={() => chrome.runtime.sendMessage({"message": "openConfig"})}>
-
- </img>
+ {/* open in new tab */}
+ <a href="https://wiki.sponsor.ajay.app/index.php/Segment_Categories"
+ target="_blank" rel="noreferrer">
+ <img id={"sponsorTimeCategoriesHelpButton" + this.idSuffix}
+ className="helpButton"
+ src={chrome.extension.getURL("icons/help.svg")}
+ title={chrome.i18n.getMessage("categoryGuidelines")} />
+ </a>
</div>
<br/>
@@ -245,7 +246,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
// See if show more categories was pressed
- if (!Config.config.categorySelections.some((category) => category.name === event.target.value)) {
+ if (event.target.value !== DEFAULT_CATEGORY && !Config.config.categorySelections.some((category) => category.name === event.target.value)) {
const chosenCategory = event.target.value;
event.target.value = DEFAULT_CATEGORY;
@@ -350,7 +351,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
const skipTime = sponsorTimes[index].segment[0];
- this.props.contentContainer().previewTime(skipTime + 0.000001, false);
+ this.props.contentContainer().previewTime(skipTime + 0.0001, false);
}
deleteTime(): void {
@@ -385,4 +386,4 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
}
}
-export default SponsorTimeEditComponent; \ No newline at end of file
+export default SponsorTimeEditComponent;
diff --git a/src/components/SubmissionNoticeComponent.tsx b/src/components/SubmissionNoticeComponent.tsx
index 4c019bdc..7fdb0fb6 100644
--- a/src/components/SubmissionNoticeComponent.tsx
+++ b/src/components/SubmissionNoticeComponent.tsx
@@ -95,7 +95,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
{/* Guidelines button */}
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
- onClick={() => window.open("https://github.com/ajayyy/SponsorBlock/wiki/Guidelines")}>
+ onClick={() => window.open("https://wiki.sponsor.ajay.app/index.php/Guidelines")}>
{chrome.i18n.getMessage(Config.config.submissionCountSinceCategories > 3 ? "guidelines" : "readTheGuidelines")}
</button>
diff --git a/src/config.ts b/src/config.ts
index 12b8ab27..7baf2999 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -38,6 +38,7 @@ interface SBConfig {
ytInfoPermissionGranted: boolean,
allowExpirements: boolean,
autoHideInfoButton: boolean,
+ autoSkipOnMusicVideos: boolean,
// What categories should be skipped
categorySelections: CategorySelection[],
@@ -179,6 +180,7 @@ const Config: SBObject = {
ytInfoPermissionGranted: false,
allowExpirements: true,
autoHideInfoButton: true,
+ autoSkipOnMusicVideos: false,
categorySelections: [{
name: "sponsor" as Category,
@@ -365,6 +367,18 @@ function migrateOldFormats(config: SBConfig) {
chrome.storage.sync.remove("askAboutUnlistedVideos");
}
+ if (!config["autoSkipOnMusicVideosUpdate"]) {
+ config["autoSkipOnMusicVideosUpdate"] = true;
+ for (const selection of config.categorySelections) {
+ if (selection.name === "music_offtopic"
+ && selection.option === CategorySkipOption.AutoSkip) {
+
+ config.autoSkipOnMusicVideos = true;
+ break;
+ }
+ }
+ }
+
// Adding preview category
if (!config["previewCategoryUpdate"]) {
config["previewCategoryUpdate"] = true;
diff --git a/src/content.ts b/src/content.ts
index 88e2075f..df1fcb18 100644
--- a/src/content.ts
+++ b/src/content.ts
@@ -122,7 +122,7 @@ const manualSkipPercentCount = 0.5;
//get messages from the background script and the popup
chrome.runtime.onMessage.addListener(messageListener);
-function messageListener(request: Message, sender: unknown, sendResponse: (response: MessageResponse) => void): void {
+function messageListener(request: Message, sender: unknown, sendResponse: (response: MessageResponse) => void): void | boolean {
//messages from popup script
switch(request.message){
case "update":
@@ -143,7 +143,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
sponsorTimes: sponsorTimes
});
- if (popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) {
+ if (!request.updating && popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) {
//the popup should be closed now that another is opening
closeInfoMenu();
}
@@ -178,8 +178,12 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
submitSponsorTimes();
break;
case "refreshSegments":
- sponsorsLookup(sponsorVideoID, false).then(() => sendResponse({}));
- break;
+ sponsorsLookup(sponsorVideoID, false).then(() => sendResponse({
+ found: sponsorDataFound,
+ sponsorTimes: sponsorTimes
+ }));
+
+ return true;
}
}
@@ -425,7 +429,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
skippingSegments = [];
for (const segment of skipInfo.array) {
- if (utils.getCategorySelection(segment.category).option === CategorySkipOption.AutoSkip &&
+ if (shouldAutoSkip(segment) &&
segment.segment[0] >= skipTime[0] && segment.segment[1] <= skipTime[1]) {
skippingSegments.push(segment);
}
@@ -595,7 +599,8 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
// Check for hashPrefix setting
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
- categories
+ categories,
+ userAgent: `${chrome.runtime.id}`
});
if (response?.ok) {
@@ -942,7 +947,7 @@ function getNextSkipIndex(currentTime: number, includeIntersectingSegments: bool
function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideHiddenSponsors = true): number {
// Only combine segments for AutoSkip
if (index == -1 ||
- utils.getCategorySelection(sponsorTimes[index].category)?.option !== CategorySkipOption.AutoSkip) return index;
+ shouldAutoSkip(sponsorTimes[index])) return index;
// Default to the normal endTime
let latestEndTimeIndex = index;
@@ -953,7 +958,7 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH
if (currentSegment[0] <= latestEndTime && currentSegment[1] > latestEndTime
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)
- && utils.getCategorySelection(sponsorTimes[i].category).option === CategorySkipOption.AutoSkip) {
+ && shouldAutoSkip(sponsorTimes[i])) {
// Overlapping segment
latestEndTimeIndex = i;
}
@@ -1035,7 +1040,7 @@ function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped:
//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
- const autoSkip: boolean = utils.getCategorySelection(skippingSegments[0].category)?.option === CategorySkipOption.AutoSkip;
+ const autoSkip: boolean = shouldAutoSkip(skippingSegments[0]);
if ((autoSkip || sponsorTimesSubmitting.includes(skippingSegments[0])) && v.currentTime !== skipTime[1]) {
// Fix for looped videos not working when skipping to the end #426
@@ -1112,6 +1117,11 @@ function createButton(baseID: string, title: string, callback: () => void, image
return newButton;
}
+function shouldAutoSkip(segment: SponsorTime): boolean {
+ return utils.getCategorySelection(segment.category)?.option === CategorySkipOption.AutoSkip ||
+ (Config.config.autoSkipOnMusicVideos && sponsorTimes.some((s) => s.category === "music_offtopic"));
+}
+
function getControls(): HTMLElement | false {
const controlsSelectors = [
// YouTube
@@ -1552,7 +1562,8 @@ async function sendSubmitMessage() {
videoID: sponsorVideoID,
userID: Config.config.userID,
segments: sponsorTimesSubmitting,
- videoDuration: video?.duration
+ videoDuration: video?.duration,
+ userAgent: `${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`
});
if (response.status === 200) {
diff --git a/src/js-components/chat.ts b/src/js-components/chat.ts
index 4bbb4a2b..bb7028d2 100644
--- a/src/js-components/chat.ts
+++ b/src/js-components/chat.ts
@@ -34,11 +34,12 @@ export async function openWarningChat(warningMessage: string): Promise<void> {
const userNameData = await utils.asyncRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID);
const userName = userNameData.ok ? JSON.parse(userNameData.responseText).userName : "";
const publicUserID = await utils.getHash(Config.config.userID);
+ const warningReasonMatch = warningMessage.match(/Warning reason: '(.+)'/);
openChat({
- displayName: `${userName ? `${userName} | `: ``}${userName !== publicUserID ? publicUserID : ``}`,
- composerInitialValue: `I got a warning and want to know what I need to do to improve. ` +
- `Warning reason: ${warningMessage.match(/Warning reason: '(.+)'/)[1]}`,
+ displayName: `${userName ? userName : ``}${userName !== publicUserID ? ` | ${publicUserID}` : ``}`,
+ composerInitialValue: `I got a warning and want to know what I need to do to improve.` +
+ warningReasonMatch ? ` Warning reason: ${warningReasonMatch[1]}` : ``,
customDescription: chrome.i18n.getMessage("warningChatInfo")
});
} \ No newline at end of file
diff --git a/src/messageTypes.ts b/src/messageTypes.ts
index 9e0da461..49a5ad92 100644
--- a/src/messageTypes.ts
+++ b/src/messageTypes.ts
@@ -12,7 +12,6 @@ interface DefaultMessage {
message:
"update"
| "sponsorStart"
- | "isInfoFound"
| "getVideoID"
| "getChannelID"
| "isChannelWhitelisted"
@@ -25,7 +24,12 @@ interface BoolValueMessage {
value: boolean;
}
-export type Message = BaseMessage & (DefaultMessage | BoolValueMessage);
+interface IsInfoFoundMessage {
+ message: "isInfoFound";
+ updating: boolean;
+}
+
+export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage);
interface IsInfoFoundMessageResponse {
found: boolean;
diff --git a/src/options.ts b/src/options.ts
index 50436b4f..ee04f1a5 100644
--- a/src/options.ts
+++ b/src/options.ts
@@ -492,6 +492,22 @@ function activatePrivateTextChange(element: HTMLElement) {
}
});
+ // See if anything extra must be done
+ switch (option) {
+ case "userID":
+ utils.asyncRequestToServer("GET", "/api/userInfo", {
+ userID: Config.config[option],
+ values: ["warnings", "banned"]
+ }).then((result) => {
+ const userInfo = JSON.parse(result.responseText);
+ if (userInfo.warnings > 0 || userInfo.banned) {
+ setButton.classList.add("hidden");
+ }
+ });
+
+ break;
+ }
+
element.querySelector(".option-hidden-section").classList.remove("hidden");
}
diff --git a/src/popup.ts b/src/popup.ts
index b5ca8235..092b7db2 100644
--- a/src/popup.ts
+++ b/src/popup.ts
@@ -234,19 +234,15 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
// Must be delayed so it only happens once loaded
setTimeout(() => PageElements.sponsorblockPopup.classList.remove("preload"), 250);
- messageHandler.query({
- active: true,
- currentWindow: true
- }, onTabs);
+ getSegmentsFromContentScript(false);
- function onTabs(tabs) {
+ function onTabs(tabs, updating: boolean): void {
messageHandler.sendMessage(tabs[0].id, {message: 'getVideoID'}, function(result) {
- console.log(result)
if (result !== undefined && result.videoID) {
currentVideoID = result.videoID;
creatingSegment = result.creatingSegment;
- loadTabData(tabs);
+ loadTabData(tabs, updating);
} else if (result === undefined && chrome.runtime.lastError) {
//this isn't a YouTube video then, or at least the content script is not loaded
displayNoVideo();
@@ -254,29 +250,30 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
});
}
- function loadTabData(tabs) {
+ function loadTabData(tabs, updating: boolean): void {
if (!currentVideoID) {
//this isn't a YouTube video then
displayNoVideo();
return;
}
- //load video times for this video
- const sponsorTimesStorage = Config.config.segmentTimes.get(currentVideoID);
- if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
- sponsorTimes = sponsorTimesStorage;
- }
-
+ sponsorTimes = Config.config.segmentTimes.get(currentVideoID) ?? [];
updateSegmentEditingUI();
- //check if this video's sponsors are known
messageHandler.sendMessage(
tabs[0].id,
- {message: 'isInfoFound'},
+ {message: 'isInfoFound', updating},
infoFound
);
}
+ function getSegmentsFromContentScript(updating: boolean): void {
+ messageHandler.query({
+ active: true,
+ currentWindow: true
+ }, (tabs) => onTabs(tabs, updating));
+ }
+
function infoFound(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
if(chrome.runtime.lastError) {
//This page doesn't have the injected content script, or at least not yet
@@ -369,7 +366,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//display the video times from the array at the top, in a different section
function displayDownloadedSponsorTimes(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
if (request.sponsorTimes != undefined) {
-
// Sort list by start time
const segmentTimes = request.sponsorTimes
.sort((a, b) => a.segment[1] - b.segment[1])
@@ -377,6 +373,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//add them as buttons to the issue reporting container
const container = document.getElementById("issueReporterTimeButtons");
+ while (container.firstChild) {
+ container.removeChild(container.firstChild);
+ }
+
for (let i = 0; i < segmentTimes.length; i++) {
const UUID = segmentTimes[i].UUID;
@@ -695,7 +695,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
messageHandler.sendMessage(
tabs[0].id,
{message: 'refreshSegments'},
- () => stopAnimation()
+ (response) => {
+ infoFound(response);
+ stopAnimation();
+ }
)}
);
}
diff --git a/src/utils.ts b/src/utils.ts
index 6d7e6e89..29a8ef38 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -438,6 +438,8 @@ export default class Utils {
}
getFormattedTime(seconds: number, precise?: boolean): string {
+ seconds = Math.max(seconds, 0);
+
const hours = Math.floor(seconds / 60 / 60);
const minutes = Math.floor(seconds / 60) % 60;
let minutesDisplay = String(minutes);