mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-12 06:27:14 +03:00
Merge branch 'master' of https://github.com/ajayyy/SponsorBlock
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "__MSG_fullName__",
|
"name": "__MSG_fullName__",
|
||||||
"short_name": "SponsorBlock",
|
"short_name": "SponsorBlock",
|
||||||
"version": "5.0.7",
|
"version": "5.1.0",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"description": "__MSG_Description__",
|
"description": "__MSG_Description__",
|
||||||
"homepage_url": "https://sponsor.ajay.app",
|
"homepage_url": "https://sponsor.ajay.app",
|
||||||
|
|||||||
@@ -25,6 +25,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "أجزاء"
|
"message": "أجزاء"
|
||||||
},
|
},
|
||||||
|
"Chapters": {
|
||||||
|
"message": "الفصول"
|
||||||
|
},
|
||||||
"upvoteButtonInfo": {
|
"upvoteButtonInfo": {
|
||||||
"message": "التصويت على هذا الإرسال"
|
"message": "التصويت على هذا الإرسال"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -238,7 +238,7 @@
|
|||||||
"message": "Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen"
|
"message": "Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen"
|
||||||
},
|
},
|
||||||
"trackDownvotesWarning": {
|
"trackDownvotesWarning": {
|
||||||
"message": "Varoitus: Tämän käytöstä poisto poistaa kaikki aiemmin tallennetut negatiiviset äänet"
|
"message": "Varoitus: Tämän poistaminen käytöstä poistaa kaikki aiemmin tallennetut alaäänet"
|
||||||
},
|
},
|
||||||
"enableQueryByHashPrefix": {
|
"enableQueryByHashPrefix": {
|
||||||
"message": "Kysely tiiviste-etuliittellä"
|
"message": "Kysely tiiviste-etuliittellä"
|
||||||
@@ -1242,6 +1242,6 @@
|
|||||||
"description": "Header of the unsubmitted segments list"
|
"description": "Header of the unsubmitted segments list"
|
||||||
},
|
},
|
||||||
"exportSegmentsAsURL": {
|
"exportSegmentsAsURL": {
|
||||||
"message": "Jaa web-osoitteena"
|
"message": "Jaa URL-osoitteena"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,12 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "מקטעים"
|
"message": "מקטעים"
|
||||||
},
|
},
|
||||||
|
"SegmentsCap": {
|
||||||
|
"message": "מקטעים"
|
||||||
|
},
|
||||||
|
"Chapters": {
|
||||||
|
"message": "פרקים"
|
||||||
|
},
|
||||||
"upvoteButtonInfo": {
|
"upvoteButtonInfo": {
|
||||||
"message": "הצבע לדיווח הזה"
|
"message": "הצבע לדיווח הזה"
|
||||||
},
|
},
|
||||||
@@ -211,6 +217,14 @@
|
|||||||
"message": "קוד מקור",
|
"message": "קוד מקור",
|
||||||
"description": "Used on Firefox Store Page"
|
"description": "Used on Firefox Store Page"
|
||||||
},
|
},
|
||||||
|
"nextChapterKeybind": {
|
||||||
|
"message": "הפרק הבא",
|
||||||
|
"description": "Keybind label"
|
||||||
|
},
|
||||||
|
"yourWork": {
|
||||||
|
"message": "העבודה שלך",
|
||||||
|
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||||
|
},
|
||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "קוד שגיאה: "
|
"message": "קוד שגיאה: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -223,13 +223,13 @@
|
|||||||
"message": "YouTube 탐색 바에서 삭제 버튼 표시"
|
"message": "YouTube 탐색 바에서 삭제 버튼 표시"
|
||||||
},
|
},
|
||||||
"enableViewTracking": {
|
"enableViewTracking": {
|
||||||
"message": "건너뛴 횟수 추적 활성화"
|
"message": "건너뛴 횟수 추적 사용"
|
||||||
},
|
},
|
||||||
"whatViewTracking": {
|
"whatViewTracking": {
|
||||||
"message": "이 기능으로 건너뛴 구간을 추적해서 사용자가 제출한 내용이 다른 분께 얼마나 도움이 되는지 알려주고 잘못된 구간이 데이터베이스에 들어가지 않도록 추천과 함께 분석에 사용해요. 이 확장 프로그램이 구간을 건너뛸 때마다 서버에 메시지를 보낼 거예요. 조회수가 정확하기 위해서는 이 설정을 변경하지 않기를 바라요. :)"
|
"message": "이 기능으로 건너뛴 구간을 추적해서 사용자가 제출한 내용이 다른 분께 얼마나 도움이 되는지 알려주고 잘못된 구간이 데이터베이스에 들어가지 않도록 추천과 함께 분석에 사용해요. 이 확장 프로그램이 구간을 건너뛸 때마다 서버에 메시지를 보낼 거예요. 조회수가 정확하기 위해서는 이 설정을 변경하지 않기를 바라요. :)"
|
||||||
},
|
},
|
||||||
"enableViewTrackingInPrivate": {
|
"enableViewTrackingInPrivate": {
|
||||||
"message": "시크릿/사생활 보호 탭에서 건너뛴 횟수 추적 활성화"
|
"message": "시크릿/사생활 보호 탭에서 건너뛴 횟수 추적 사용"
|
||||||
},
|
},
|
||||||
"enableTrackDownvotes": {
|
"enableTrackDownvotes": {
|
||||||
"message": "비추천한 구간 저장"
|
"message": "비추천한 구간 저장"
|
||||||
@@ -238,7 +238,7 @@
|
|||||||
"message": "비추천한 구간을 새로고침 이후에도 계속 숨겨요"
|
"message": "비추천한 구간을 새로고침 이후에도 계속 숨겨요"
|
||||||
},
|
},
|
||||||
"trackDownvotesWarning": {
|
"trackDownvotesWarning": {
|
||||||
"message": "경고: 비활성화하면 이전에 저장된 비추천 구간이 삭제돼요"
|
"message": "경고: 사용하지 않으면 이전에 저장된 비추천 구간이 삭제돼요"
|
||||||
},
|
},
|
||||||
"enableQueryByHashPrefix": {
|
"enableQueryByHashPrefix": {
|
||||||
"message": "해시 접두사로 요청 전송"
|
"message": "해시 접두사로 요청 전송"
|
||||||
@@ -377,16 +377,16 @@
|
|||||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||||
},
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "자동 건너뛰기 비활성화"
|
"message": "자동 건너뛰기 사용 안 함"
|
||||||
},
|
},
|
||||||
"enableAutoSkip": {
|
"enableAutoSkip": {
|
||||||
"message": "자동 건너뛰기 활성화"
|
"message": "자동 건너뛰기 사용"
|
||||||
},
|
},
|
||||||
"audioNotification": {
|
"audioNotification": {
|
||||||
"message": "건너뛸 때 소리 재생"
|
"message": "건너뛸 때 소리 재생"
|
||||||
},
|
},
|
||||||
"audioNotificationDescription": {
|
"audioNotificationDescription": {
|
||||||
"message": "구간을 건너뛸 때마다 소리를 재생해요. 자동 건너뛰기가 비활성화된 경우, 아무 소리도 재생되지 않아요."
|
"message": "구간을 건너뛸 때마다 소리를 재생해요. 자동 건너뛰기를 사용하지 않는 경우, 아무 소리도 재생되지 않아요."
|
||||||
},
|
},
|
||||||
"showTimeWithSkips": {
|
"showTimeWithSkips": {
|
||||||
"message": "건너뛰기로 제외된 시간 표시"
|
"message": "건너뛰기로 제외된 시간 표시"
|
||||||
@@ -446,7 +446,7 @@
|
|||||||
"message": "지원되는 사이트: "
|
"message": "지원되는 사이트: "
|
||||||
},
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "Invidious 지원 활성화, 자동 건너뛰기 비활성화, 버튼 숨기기 등이 있어요."
|
"message": "Invidious 지원 활성화, 자동 건너뛰기 사용 안 함, 버튼 숨기기 등이 있어요."
|
||||||
},
|
},
|
||||||
"addInvidiousInstance": {
|
"addInvidiousInstance": {
|
||||||
"message": "제3자 클라이언트 인스턴스 추가"
|
"message": "제3자 클라이언트 인스턴스 추가"
|
||||||
@@ -458,7 +458,7 @@
|
|||||||
"message": "추가"
|
"message": "추가"
|
||||||
},
|
},
|
||||||
"addInvidiousInstanceError": {
|
"addInvidiousInstanceError": {
|
||||||
"message": "잘못된 도메인이에요. 도메인 부분만 포함해야 해요. 예: invious.ajay.app"
|
"message": "잘못된 도메인이에요. 도메인 부분만 포함해야 해요. 예시: invious.ajay.app"
|
||||||
},
|
},
|
||||||
"resetInvidiousInstance": {
|
"resetInvidiousInstance": {
|
||||||
"message": "Invidious 인스턴스 목록 초기화"
|
"message": "Invidious 인스턴스 목록 초기화"
|
||||||
@@ -830,7 +830,7 @@
|
|||||||
"message": "카테고리 선택"
|
"message": "카테고리 선택"
|
||||||
},
|
},
|
||||||
"enableThisCategoryFirst": {
|
"enableThisCategoryFirst": {
|
||||||
"message": "\"{0}\" 카테고리의 구간을 제출하려면, 설정에서 활성화를 해주셔야 해요. 바로 설정 창으로 이동하실 거예요.",
|
"message": "\"{0}\" 카테고리의 구간을 제출하려면, 설정에서 사용을 해주셔야 해요. 바로 설정 창으로 이동하실 거예요.",
|
||||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||||
},
|
},
|
||||||
"poiOnlyOneSegment": {
|
"poiOnlyOneSegment": {
|
||||||
@@ -872,7 +872,7 @@
|
|||||||
"message": "권한 요청에 실패했어요. 거부를 누르셨나요?"
|
"message": "권한 요청에 실패했어요. 거부를 누르셨나요?"
|
||||||
},
|
},
|
||||||
"adblockerIssueWhitelist": {
|
"adblockerIssueWhitelist": {
|
||||||
"message": "이 문제를 해결할 수 없는 경우 SponsorBlock이 이 동영상의 채널 정보를 찾을 수 없는 것일 수 있으니, '건너뛰기 전 채널 강제 확인' 설정을 비활성화해주세요."
|
"message": "이 문제를 해결할 수 없는 경우 SponsorBlock이 이 동영상의 채널 정보를 찾을 수 없는 것일 수 있으니, '건너뛰기 전 채널 강제 확인' 설정을 사용하지 않아야 해요"
|
||||||
},
|
},
|
||||||
"forceChannelCheck": {
|
"forceChannelCheck": {
|
||||||
"message": "건너뛰기 전 채널 강제 확인"
|
"message": "건너뛰기 전 채널 강제 확인"
|
||||||
@@ -897,7 +897,7 @@
|
|||||||
"message": "카테고리 변경"
|
"message": "카테고리 변경"
|
||||||
},
|
},
|
||||||
"nonMusicCategoryOnMusic": {
|
"nonMusicCategoryOnMusic": {
|
||||||
"message": "이 동영상은 음악 동영상으로 분류되어 있어요. 동영상에 스폰서 광고 구간이 있나요? \"음악이 아닌 구간\"으로 지정된 카테고리인 경우, 확장 프로그램 설정을 열어 이 카테고리를 활성화하세요. 그리고, 이 구간을 \"스폰서 광고 구간\" 대신 \"음악이 아닌 구간\"으로 지정하세요. 혼동된다면 가이드라인을 읽어주세요."
|
"message": "이 동영상은 음악 동영상으로 분류되어 있어요. 동영상에 스폰서 광고 구간이 있나요? \"음악이 아닌 구간\"으로 지정된 카테고리인 경우, 확장 프로그램 설정을 열어 이 카테고리를 사용하세요. 그리고, 이 구간을 \"스폰서 광고 구간\" 대신 \"음악이 아닌 구간\"으로 지정하세요. 혼동된다면 가이드라인을 읽어주세요."
|
||||||
},
|
},
|
||||||
"multipleSegments": {
|
"multipleSegments": {
|
||||||
"message": "여러 구간"
|
"message": "여러 구간"
|
||||||
@@ -972,7 +972,7 @@
|
|||||||
"message": "아래 설정을 확인해 보세요"
|
"message": "아래 설정을 확인해 보세요"
|
||||||
},
|
},
|
||||||
"helpPageFeatureDisclaimer": {
|
"helpPageFeatureDisclaimer": {
|
||||||
"message": "기본값으로 많은 기능이 비활성화되어 있어요. 인트로, 아웃트로 같은 부분을 건너뛰고 싶으시다면 아래 설정을 켜야 해요. 또한 UI 요소를 숨기거나 표시할 수 있답니다."
|
"message": "기본값으로 많은 기능이 사용되지 않아요. 인트로, 아웃트로 같은 부분을 건너뛰고 싶으시다면 아래 설정을 사용해야 해요. 또한 UI 요소를 숨기거나 표시할 수 있답니다."
|
||||||
},
|
},
|
||||||
"helpPageHowSkippingWorks": {
|
"helpPageHowSkippingWorks": {
|
||||||
"message": "건너뛰기가 작동하는 방법"
|
"message": "건너뛰기가 작동하는 방법"
|
||||||
@@ -1002,7 +1002,7 @@
|
|||||||
"message": "이건 너무 느린 거 같아요"
|
"message": "이건 너무 느린 거 같아요"
|
||||||
},
|
},
|
||||||
"helpPageTooSlow1": {
|
"helpPageTooSlow1": {
|
||||||
"message": "원하는 경우 단축키를 이용할 수 있어요. 쌍반점(세미콜론) 키를 눌러 스폰서 광고 구간의 시점/종점을 설정할 수 있으며 작은따옴표 키를 눌러 구간을 제출할 수 있답니다. 언제든지 설정에서 변경할 수 있어요. QWERTY 자판을 사용하지 않는 경우, 단축키를 변경해야 할 수도 있어요."
|
"message": "원하는 경우 단축키를 사용할 수 있어요. 쌍반점(세미콜론) 키를 눌러 스폰서 광고 구간의 시점/종점을 설정할 수 있으며 작은따옴표 키를 눌러 구간을 제출할 수 있답니다. 언제든지 설정에서 변경할 수 있어요. QWERTY 자판을 사용하지 않는 경우, 단축키를 변경해야 할 수도 있어요."
|
||||||
},
|
},
|
||||||
"helpPageCopyOfDatabase": {
|
"helpPageCopyOfDatabase": {
|
||||||
"message": "데이터베이스의 복사본을 구할 수 있나요? 개발자분께 무슨 일이 생기면 어떻게 되는 거죠?"
|
"message": "데이터베이스의 복사본을 구할 수 있나요? 개발자분께 무슨 일이 생기면 어떻게 되는 거죠?"
|
||||||
@@ -1011,7 +1011,7 @@
|
|||||||
"message": "데이터베이스는 여기에서 확인하실 수 있어요:"
|
"message": "데이터베이스는 여기에서 확인하실 수 있어요:"
|
||||||
},
|
},
|
||||||
"helpPageCopyOfDatabase2": {
|
"helpPageCopyOfDatabase2": {
|
||||||
"message": "또한 소스 코드는 자유롭게 이용할 수 있어요. 따라서 데이터베이스에 무슨 일이 생기더라도, 제출된 구간이 사라지는 일은 없을 거예요."
|
"message": "또한 소스 코드는 자유롭게 사용할 수 있어요. 따라서 데이터베이스에 무슨 일이 생기더라도, 제출된 구간이 사라지는 일은 없을 거예요."
|
||||||
},
|
},
|
||||||
"helpPageNews": {
|
"helpPageNews": {
|
||||||
"message": "새로운 변경 사항은 어디에서 확인하나요?"
|
"message": "새로운 변경 사항은 어디에서 확인하나요?"
|
||||||
@@ -1138,7 +1138,7 @@
|
|||||||
"message": "라이선스 키가 유효하지 않아요"
|
"message": "라이선스 키가 유효하지 않아요"
|
||||||
},
|
},
|
||||||
"hideUpsells": {
|
"hideUpsells": {
|
||||||
"message": "추가 결제 없이는 숨김 설정을 이용하실 수 없어요"
|
"message": "(추가 결제 없이는 숨김 설정을 사용할 수 없어요)"
|
||||||
},
|
},
|
||||||
"chooseACountry": {
|
"chooseACountry": {
|
||||||
"message": "국가 선택"
|
"message": "국가 선택"
|
||||||
@@ -1176,10 +1176,10 @@
|
|||||||
"message": "라이선스 키를 입력하세요"
|
"message": "라이선스 키를 입력하세요"
|
||||||
},
|
},
|
||||||
"chaptersPage1": {
|
"chaptersPage1": {
|
||||||
"message": "SponsorBlock 사용자 참여 챕터 기능은 라이선스 결제 사용자나, 이전 기여를 통해 접근을 허가받은 사용자만 이용할 수 있어요"
|
"message": "SponsorBlock 사용자 참여 챕터 기능은 라이선스 결제 사용자나, 이전 기여를 통해 접근을 허가받은 사용자만 사용할 수 있어요"
|
||||||
},
|
},
|
||||||
"chaptersPage2": {
|
"chaptersPage2": {
|
||||||
"message": "참고: 여전히 챕터 제출 권한은 산정된 평판만을 바탕으로 부여돼요. 라이선스를 결제하면 다른 분이 제출한 챕터를 확인하는 기능만 추가로 이용할 수 있어요",
|
"message": "참고: 여전히 챕터 제출 권한은 산정된 평판만을 바탕으로 부여돼요. 라이선스를 결제하면 다른 분이 제출한 챕터를 확인하는 기능만 추가로 사용할 수 있어요",
|
||||||
"description": "On the chapters page for getting access to the paid chapters feature"
|
"description": "On the chapters page for getting access to the paid chapters feature"
|
||||||
},
|
},
|
||||||
"chapterNewFeature": {
|
"chapterNewFeature": {
|
||||||
@@ -1187,7 +1187,7 @@
|
|||||||
"description": "After the comma, a list of chapters for this video will appear"
|
"description": "After the comma, a list of chapters for this video will appear"
|
||||||
},
|
},
|
||||||
"chapterNewFeature2": {
|
"chapterNewFeature2": {
|
||||||
"message": "새로운 기능: 사용자 참여 챕터 기능. 챕터는 사용자가 직접 이름을 지정할 수 있고 중첩시킬 수 있어 더욱 더 정확해요. 설정에서 활성화해서 무료로 사용할 수 있어요."
|
"message": "새로운 기능: 사용자 참여 챕터 기능. 챕터는 사용자가 직접 이름을 지정할 수 있고 중첩시킬 수 있어 더욱 더 정확해요. 설정에서 사용해서 무료로 사용할 수 있어요."
|
||||||
},
|
},
|
||||||
"unsubmittedSegmentCounts": {
|
"unsubmittedSegmentCounts": {
|
||||||
"message": "You currently have {0} on {1}",
|
"message": "You currently have {0} on {1}",
|
||||||
|
|||||||
@@ -35,6 +35,9 @@
|
|||||||
"message": "Pokazuj segmenty jako rozdziały",
|
"message": "Pokazuj segmenty jako rozdziały",
|
||||||
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
|
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
|
||||||
},
|
},
|
||||||
|
"showSegmentNameInChapterBar": {
|
||||||
|
"message": "Pokaż bieżący segment poza czasem wideo"
|
||||||
|
},
|
||||||
"upvoteButtonInfo": {
|
"upvoteButtonInfo": {
|
||||||
"message": "Zagłosuj na ten segment"
|
"message": "Zagłosuj na ten segment"
|
||||||
},
|
},
|
||||||
@@ -122,6 +125,9 @@
|
|||||||
"closePopup": {
|
"closePopup": {
|
||||||
"message": "Zamknij okno"
|
"message": "Zamknij okno"
|
||||||
},
|
},
|
||||||
|
"closeIcon": {
|
||||||
|
"message": "Wyłącz ikonę"
|
||||||
|
},
|
||||||
"SubmitTimes": {
|
"SubmitTimes": {
|
||||||
"message": "Prześlij segmenty"
|
"message": "Prześlij segmenty"
|
||||||
},
|
},
|
||||||
@@ -246,6 +252,9 @@
|
|||||||
"whatRefetchWhenNotFound": {
|
"whatRefetchWhenNotFound": {
|
||||||
"message": "Jeśli film jest nowy i nie znaleziono żadnych segmentów, dane będą pobierane na nowo co kilka minut w czasie oglądania."
|
"message": "Jeśli film jest nowy i nie znaleziono żadnych segmentów, dane będą pobierane na nowo co kilka minut w czasie oglądania."
|
||||||
},
|
},
|
||||||
|
"enableShowCategoryWithoutPermission": {
|
||||||
|
"message": "Pokaż kategorie w menu zgłoszeń, nawet bez uprawnień do zgłaszania"
|
||||||
|
},
|
||||||
"showNotice": {
|
"showNotice": {
|
||||||
"message": "Pokaż informacje ponownie"
|
"message": "Pokaż informacje ponownie"
|
||||||
},
|
},
|
||||||
@@ -408,9 +417,18 @@
|
|||||||
"statusReminder": {
|
"statusReminder": {
|
||||||
"message": "Sprawdź status serwera na status.sponsor.ajay.app"
|
"message": "Sprawdź status serwera na status.sponsor.ajay.app"
|
||||||
},
|
},
|
||||||
|
"changeUserID": {
|
||||||
|
"message": "Importuj/Eksportuj swój prywatny UserID"
|
||||||
|
},
|
||||||
"whatChangeUserID": {
|
"whatChangeUserID": {
|
||||||
"message": "To powinno pozostać prywatne. Jest to niczym hasło i nie powinno zostać nikomu udostępnione. Przy jego użyciu ktoś może się pod ciebie podszywać. Jeśli szukasz publicznego ID użytkownika, kliknij ikonę schowka w wyskakującym oknie."
|
"message": "To powinno pozostać prywatne. Jest to niczym hasło i nie powinno zostać nikomu udostępnione. Przy jego użyciu ktoś może się pod ciebie podszywać. Jeśli szukasz publicznego ID użytkownika, kliknij ikonę schowka w wyskakującym oknie."
|
||||||
},
|
},
|
||||||
|
"setUserID": {
|
||||||
|
"message": "Ustaw prywatny UserID"
|
||||||
|
},
|
||||||
|
"userIDChangeWarning": {
|
||||||
|
"message": "Uwaga: Zmiana ID użytkownika jest trwała. Czy na pewno chcesz to zrobić? Na wszelki wypadek skopiuj swój poprzedni ID."
|
||||||
|
},
|
||||||
"createdBy": {
|
"createdBy": {
|
||||||
"message": "Stworzony przez"
|
"message": "Stworzony przez"
|
||||||
},
|
},
|
||||||
@@ -454,6 +472,9 @@
|
|||||||
"minDurationDescription": {
|
"minDurationDescription": {
|
||||||
"message": "Segmenty krótsze niż ustawiona wartość nie będą pomijane ani pokazywane w odtwarzaczu."
|
"message": "Segmenty krótsze niż ustawiona wartość nie będą pomijane ani pokazywane w odtwarzaczu."
|
||||||
},
|
},
|
||||||
|
"enableManualSkipOnFullVideo": {
|
||||||
|
"message": "Użyj ręcznego pomijania, gdy istnieje etykieta na całym filmie"
|
||||||
|
},
|
||||||
"skipNoticeDuration": {
|
"skipNoticeDuration": {
|
||||||
"message": "Czas trwania powiadomienia pominięcia (sekundy):"
|
"message": "Czas trwania powiadomienia pominięcia (sekundy):"
|
||||||
},
|
},
|
||||||
@@ -502,6 +523,9 @@
|
|||||||
"exportOptionsUpload": {
|
"exportOptionsUpload": {
|
||||||
"message": "Wczytaj z pliku"
|
"message": "Wczytaj z pliku"
|
||||||
},
|
},
|
||||||
|
"whatExportOptions": {
|
||||||
|
"message": "Jest to cała twoja konfiguracja w formacie JSON. Zawarty jest w niej twój prywatny UserID, więc uważaj, komu ją udostępniasz."
|
||||||
|
},
|
||||||
"setOptions": {
|
"setOptions": {
|
||||||
"message": "Zapisz ustawienia"
|
"message": "Zapisz ustawienia"
|
||||||
},
|
},
|
||||||
@@ -1019,6 +1043,12 @@
|
|||||||
"hideSegment": {
|
"hideSegment": {
|
||||||
"message": "Ukryj segment"
|
"message": "Ukryj segment"
|
||||||
},
|
},
|
||||||
|
"skipSegment": {
|
||||||
|
"message": "Pomiń segment"
|
||||||
|
},
|
||||||
|
"playChapter": {
|
||||||
|
"message": "Odtwórz rozdział"
|
||||||
|
},
|
||||||
"SponsorTimeEditScrollNewFeature": {
|
"SponsorTimeEditScrollNewFeature": {
|
||||||
"message": "Użyj scroll'a myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Kombinacje z ctrl'em i shift'em mogą być użyte, aby doszlifować zmiany."
|
"message": "Użyj scroll'a myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Kombinacje z ctrl'em i shift'em mogą być użyte, aby doszlifować zmiany."
|
||||||
},
|
},
|
||||||
@@ -1085,6 +1115,9 @@
|
|||||||
"exportSegments": {
|
"exportSegments": {
|
||||||
"message": "Eksportuj segmenty"
|
"message": "Eksportuj segmenty"
|
||||||
},
|
},
|
||||||
|
"importSegments": {
|
||||||
|
"message": "Importuj segmenty"
|
||||||
|
},
|
||||||
"Import": {
|
"Import": {
|
||||||
"message": "Importuj",
|
"message": "Importuj",
|
||||||
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
|
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
|
||||||
@@ -1101,9 +1134,23 @@
|
|||||||
"chooseACountry": {
|
"chooseACountry": {
|
||||||
"message": "Wybierz kraj"
|
"message": "Wybierz kraj"
|
||||||
},
|
},
|
||||||
|
"noDiscount": {
|
||||||
|
"message": "Nie kwalifikujesz się do przeceny"
|
||||||
|
},
|
||||||
|
"discountLink": {
|
||||||
|
"message": "Link rabatowy"
|
||||||
|
},
|
||||||
"selectYourCountry": {
|
"selectYourCountry": {
|
||||||
"message": "Wybierz swój kraj"
|
"message": "Wybierz swój kraj"
|
||||||
},
|
},
|
||||||
|
"alreadyDonated": {
|
||||||
|
"message": "Jeśli do tej pory przekazałeś jakąkolwiek darowiznę, możesz odebrać darmowy dostęp poprzez wysyłanie maila do:",
|
||||||
|
"description": "After the colon is an email address"
|
||||||
|
},
|
||||||
|
"cantAfford": {
|
||||||
|
"message": "Jeśli nie możesz sobie pozwolić na zakup licencji, kliknij {tutaj} aby sprawdzić, czy kwalifikujesz się do zniżki",
|
||||||
|
"description": "Keep the curly braces. The word 'here' should be translated as well."
|
||||||
|
},
|
||||||
"patreonSignIn": {
|
"patreonSignIn": {
|
||||||
"message": "Zaloguj się za pomocą Patreon"
|
"message": "Zaloguj się za pomocą Patreon"
|
||||||
},
|
},
|
||||||
@@ -1119,10 +1166,20 @@
|
|||||||
"enterLicenseKey": {
|
"enterLicenseKey": {
|
||||||
"message": "Wprowadź klucz licencyjny"
|
"message": "Wprowadź klucz licencyjny"
|
||||||
},
|
},
|
||||||
|
"chaptersPage1": {
|
||||||
|
"message": "Funkcja społecznościowych rozdziałów SponsorBlock jest dostępna tylko dla osób, które wykupią licencję, albo którym przyznano dostęp za darmo ze względu na swoje wcześniejszy wkład"
|
||||||
|
},
|
||||||
|
"chaptersPage2": {
|
||||||
|
"message": "Uwaga: Przesyłanie rozdziałów jest nadal oparte na skalkulowanej reputacji. Kupowanie licencji pozwala tylko przeglądać rozdziały przesłane przez innych",
|
||||||
|
"description": "On the chapters page for getting access to the paid chapters feature"
|
||||||
|
},
|
||||||
"chapterNewFeature": {
|
"chapterNewFeature": {
|
||||||
"message": "Nowa funkcja: niestandardowe rozdziały ze źródeł społecznościowych. Są to sekcje niestandardowo nazwane w filmach, które mogą być ustawione w sposób bardziej precyzyjny. Kup licencję, aby wyświetlić rozdziały przedstawione na tym filmie, takie jak: ",
|
"message": "Nowa funkcja: niestandardowe rozdziały ze źródeł społecznościowych. Są to sekcje niestandardowo nazwane w filmach, które mogą być ustawione w sposób bardziej precyzyjny. Kup licencję, aby wyświetlić rozdziały przedstawione na tym filmie, takie jak: ",
|
||||||
"description": "After the comma, a list of chapters for this video will appear"
|
"description": "After the comma, a list of chapters for this video will appear"
|
||||||
},
|
},
|
||||||
|
"chapterNewFeature2": {
|
||||||
|
"message": "Nowa funkcja: niestandardowe rozdziały ze źródeł społecznościowych. Są to sekcje niestandardowo nazwane w filmach, które mogą być ustawione w sposób bardziej precyzyjny."
|
||||||
|
},
|
||||||
"unsubmittedSegmentCounts": {
|
"unsubmittedSegmentCounts": {
|
||||||
"message": "Aktualnie masz {0} na {1}",
|
"message": "Aktualnie masz {0} na {1}",
|
||||||
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
|
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
|
||||||
|
|||||||
@@ -35,6 +35,9 @@
|
|||||||
"message": "Renderizar segmentos como capítulos",
|
"message": "Renderizar segmentos como capítulos",
|
||||||
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
|
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
|
||||||
},
|
},
|
||||||
|
"showSegmentNameInChapterBar": {
|
||||||
|
"message": "Mostrar Segmento Atual ao Lado do Tempo do Vídeo"
|
||||||
|
},
|
||||||
"upvoteButtonInfo": {
|
"upvoteButtonInfo": {
|
||||||
"message": "Votar nesse segmento positivamente"
|
"message": "Votar nesse segmento positivamente"
|
||||||
},
|
},
|
||||||
@@ -122,6 +125,9 @@
|
|||||||
"closePopup": {
|
"closePopup": {
|
||||||
"message": "Fechar Popup"
|
"message": "Fechar Popup"
|
||||||
},
|
},
|
||||||
|
"closeIcon": {
|
||||||
|
"message": "Ícone de Fechar"
|
||||||
|
},
|
||||||
"SubmitTimes": {
|
"SubmitTimes": {
|
||||||
"message": "Enviar Segmentos"
|
"message": "Enviar Segmentos"
|
||||||
},
|
},
|
||||||
@@ -246,6 +252,12 @@
|
|||||||
"whatRefetchWhenNotFound": {
|
"whatRefetchWhenNotFound": {
|
||||||
"message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos buscando enquanto você assiste."
|
"message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos buscando enquanto você assiste."
|
||||||
},
|
},
|
||||||
|
"enableShowCategoryWithoutPermission": {
|
||||||
|
"message": "Mostrar categorias no menu de envios mesmo sem permissão de envio"
|
||||||
|
},
|
||||||
|
"whatShowCategoryWithoutPermission": {
|
||||||
|
"message": "Algumas categorias exigem autorização de envio devido a requisitos mínimos de reputação"
|
||||||
|
},
|
||||||
"showNotice": {
|
"showNotice": {
|
||||||
"message": "Mostrar notificação outra vez"
|
"message": "Mostrar notificação outra vez"
|
||||||
},
|
},
|
||||||
@@ -408,9 +420,18 @@
|
|||||||
"statusReminder": {
|
"statusReminder": {
|
||||||
"message": "Verifique status.sponsor.ajay.app para o status do servidor."
|
"message": "Verifique status.sponsor.ajay.app para o status do servidor."
|
||||||
},
|
},
|
||||||
|
"changeUserID": {
|
||||||
|
"message": "Importar/Exportar Seu UserID Privado"
|
||||||
|
},
|
||||||
"whatChangeUserID": {
|
"whatChangeUserID": {
|
||||||
"message": "Esta informação deve se mantida privada. Ela é como uma senha e não deve ser compartilhada. Outras pessoas poderão se passar por você caso obtenham acesso. Se estiver procurando por sua ID Pública de Usuário, clique no ícone de prancheta no popup."
|
"message": "Esta informação deve se mantida privada. Ela é como uma senha e não deve ser compartilhada. Outras pessoas poderão se passar por você caso obtenham acesso. Se estiver procurando por sua ID Pública de Usuário, clique no ícone de prancheta no popup."
|
||||||
},
|
},
|
||||||
|
"setUserID": {
|
||||||
|
"message": "Definir UserID Privado"
|
||||||
|
},
|
||||||
|
"userIDChangeWarning": {
|
||||||
|
"message": "Aviso: A modificação do ID de usuário privado é permanente. Você tem certeza de que quer fazer isso? Certifique-se de fazer backup do anterior."
|
||||||
|
},
|
||||||
"createdBy": {
|
"createdBy": {
|
||||||
"message": "Criado por"
|
"message": "Criado por"
|
||||||
},
|
},
|
||||||
@@ -454,6 +475,12 @@
|
|||||||
"minDurationDescription": {
|
"minDurationDescription": {
|
||||||
"message": "Segmentos menores do que o valor definido não serão pulados ou mostrados no reprodutor."
|
"message": "Segmentos menores do que o valor definido não serão pulados ou mostrados no reprodutor."
|
||||||
},
|
},
|
||||||
|
"enableManualSkipOnFullVideo": {
|
||||||
|
"message": "Usar o pulo manual quando houver um rótulo de vídeo completo"
|
||||||
|
},
|
||||||
|
"whatManualSkipOnFullVideo": {
|
||||||
|
"message": "Para pessoas que desejam assistir ao vídeo sem interrupção se ele for totalmente patrocinado ou autopromoção."
|
||||||
|
},
|
||||||
"skipNoticeDuration": {
|
"skipNoticeDuration": {
|
||||||
"message": "Duração do aviso prévio de pular (segundos):"
|
"message": "Duração do aviso prévio de pular (segundos):"
|
||||||
},
|
},
|
||||||
@@ -709,6 +736,12 @@
|
|||||||
"category_chapter": {
|
"category_chapter": {
|
||||||
"message": "Capítulo"
|
"message": "Capítulo"
|
||||||
},
|
},
|
||||||
|
"category_chapter_description": {
|
||||||
|
"message": "Capítulos personalizados que descrevem as principais seções de um vídeo."
|
||||||
|
},
|
||||||
|
"category_chapter_guideline1": {
|
||||||
|
"message": "Não mencione os nomes dos patrocinadores"
|
||||||
|
},
|
||||||
"category_livestream_messages": {
|
"category_livestream_messages": {
|
||||||
"message": "Livestream: Leituras de Doação/Mensagem"
|
"message": "Livestream: Leituras de Doação/Mensagem"
|
||||||
},
|
},
|
||||||
@@ -739,6 +772,9 @@
|
|||||||
"showOverlay_full": {
|
"showOverlay_full": {
|
||||||
"message": "Mostrar Rótulo"
|
"message": "Mostrar Rótulo"
|
||||||
},
|
},
|
||||||
|
"showOverlay_chapter": {
|
||||||
|
"message": "Mostrar Capítulos"
|
||||||
|
},
|
||||||
"autoSkipOnMusicVideos": {
|
"autoSkipOnMusicVideos": {
|
||||||
"message": "Pular automaticamente todos os segmentos quando há um segmento que não é música"
|
"message": "Pular automaticamente todos os segmentos quando há um segmento que não é música"
|
||||||
},
|
},
|
||||||
@@ -866,6 +902,9 @@
|
|||||||
"categoryPillTitleText": {
|
"categoryPillTitleText": {
|
||||||
"message": "Este vídeo inteiro está rotulado como esta categoria e está muito integrado para poder ser separado"
|
"message": "Este vídeo inteiro está rotulado como esta categoria e está muito integrado para poder ser separado"
|
||||||
},
|
},
|
||||||
|
"chapterNameTooltipWarning": {
|
||||||
|
"message": "Um de seus nomes de capítulo é semelhante a uma categoria. Sempre que possível, você deve usar categorias."
|
||||||
|
},
|
||||||
"experiementOptOut": {
|
"experiementOptOut": {
|
||||||
"message": "Optar por sair de todos os experimentos futuros",
|
"message": "Optar por sair de todos os experimentos futuros",
|
||||||
"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."
|
"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."
|
||||||
@@ -873,6 +912,9 @@
|
|||||||
"hideForever": {
|
"hideForever": {
|
||||||
"message": "Ocultar para sempre"
|
"message": "Ocultar para sempre"
|
||||||
},
|
},
|
||||||
|
"warningChatInfo": {
|
||||||
|
"message": "Percebemos que você estava cometendo alguns erros comuns que não são prejudiciais"
|
||||||
|
},
|
||||||
"Donate": {
|
"Donate": {
|
||||||
"message": "Doar"
|
"message": "Doar"
|
||||||
},
|
},
|
||||||
@@ -945,6 +987,9 @@
|
|||||||
"LearnMore": {
|
"LearnMore": {
|
||||||
"message": "Saiba mais"
|
"message": "Saiba mais"
|
||||||
},
|
},
|
||||||
|
"FullDetails": {
|
||||||
|
"message": "Ver Detalhes Completos"
|
||||||
|
},
|
||||||
"CopyDownvoteButtonInfo": {
|
"CopyDownvoteButtonInfo": {
|
||||||
"message": "Dá voto negativo e cria uma cópia local para você reenviar"
|
"message": "Dá voto negativo e cria uma cópia local para você reenviar"
|
||||||
},
|
},
|
||||||
@@ -969,6 +1014,12 @@
|
|||||||
"hideSegment": {
|
"hideSegment": {
|
||||||
"message": "Ocultar segmento"
|
"message": "Ocultar segmento"
|
||||||
},
|
},
|
||||||
|
"skipSegment": {
|
||||||
|
"message": "Pular segmento"
|
||||||
|
},
|
||||||
|
"playChapter": {
|
||||||
|
"message": "Reproduzir capítulo"
|
||||||
|
},
|
||||||
"SponsorTimeEditScrollNewFeature": {
|
"SponsorTimeEditScrollNewFeature": {
|
||||||
"message": "Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças."
|
"message": "Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças."
|
||||||
},
|
},
|
||||||
@@ -1031,5 +1082,69 @@
|
|||||||
},
|
},
|
||||||
"confirmResetToDefault": {
|
"confirmResetToDefault": {
|
||||||
"message": "Tem certeza de que deseja redefinir todas as configurações para os valores padrão? Essa ação não poderá ser desfeita."
|
"message": "Tem certeza de que deseja redefinir todas as configurações para os valores padrão? Essa ação não poderá ser desfeita."
|
||||||
|
},
|
||||||
|
"exportSegments": {
|
||||||
|
"message": "Exportar segmentos"
|
||||||
|
},
|
||||||
|
"importSegments": {
|
||||||
|
"message": "Importar segmentos"
|
||||||
|
},
|
||||||
|
"Import": {
|
||||||
|
"message": "Importar",
|
||||||
|
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
|
||||||
|
},
|
||||||
|
"selectYourCountry": {
|
||||||
|
"message": "Selecione o seu país"
|
||||||
|
},
|
||||||
|
"unsubmittedSegmentCountsZero": {
|
||||||
|
"message": "No momento, você não tem segmentos não enviados",
|
||||||
|
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
|
||||||
|
},
|
||||||
|
"unsubmittedSegmentsSingular": {
|
||||||
|
"message": "segmento não enviado",
|
||||||
|
"description": "Example: You currently have 1 *unsubmitted segment* on 1 video"
|
||||||
|
},
|
||||||
|
"unsubmittedSegmentsPlural": {
|
||||||
|
"message": "segmentos não enviados",
|
||||||
|
"description": "Example: You currently have 12 *unsubmitted segments* on 5 videos"
|
||||||
|
},
|
||||||
|
"videosSingular": {
|
||||||
|
"message": "vídeo",
|
||||||
|
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
|
||||||
|
},
|
||||||
|
"videosPlural": {
|
||||||
|
"message": "vídeos",
|
||||||
|
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
|
||||||
|
},
|
||||||
|
"clearUnsubmittedSegments": {
|
||||||
|
"message": "Excluir todos os segmentos",
|
||||||
|
"description": "Label for a button in settings"
|
||||||
|
},
|
||||||
|
"clearUnsubmittedSegmentsConfirm": {
|
||||||
|
"message": "Tem certeza de que deseja excluir todos os segmentos não enviados?",
|
||||||
|
"description": "Confirmation message for the Clear unsubmitted segments button"
|
||||||
|
},
|
||||||
|
"showUnsubmittedSegments": {
|
||||||
|
"message": "Mostrar segmentos",
|
||||||
|
"description": "Show/hide button for the unsubmitted segments list"
|
||||||
|
},
|
||||||
|
"hideUnsubmittedSegments": {
|
||||||
|
"message": "Ocultar segmentos",
|
||||||
|
"description": "Show/hide button for the unsubmitted segments list"
|
||||||
|
},
|
||||||
|
"videoID": {
|
||||||
|
"message": "ID do Vídeo",
|
||||||
|
"description": "Header of the unsubmitted segments list"
|
||||||
|
},
|
||||||
|
"segmentCount": {
|
||||||
|
"message": "Número de segmentos",
|
||||||
|
"description": "Header of the unsubmitted segments list"
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"message": "Ações",
|
||||||
|
"description": "Header of the unsubmitted segments list"
|
||||||
|
},
|
||||||
|
"exportSegmentsAsURL": {
|
||||||
|
"message": "Compartilhar como URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,19 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "片段"
|
"message": "片段"
|
||||||
},
|
},
|
||||||
|
"SegmentsCap": {
|
||||||
|
"message": "片段"
|
||||||
|
},
|
||||||
|
"Chapters": {
|
||||||
|
"message": "章节"
|
||||||
|
},
|
||||||
|
"renderAsChapters": {
|
||||||
|
"message": "将片段显示为章节",
|
||||||
|
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
|
||||||
|
},
|
||||||
|
"showSegmentNameInChapterBar": {
|
||||||
|
"message": "在视频时间旁显示当前片段"
|
||||||
|
},
|
||||||
"upvoteButtonInfo": {
|
"upvoteButtonInfo": {
|
||||||
"message": "为这个提交点赞"
|
"message": "为这个提交点赞"
|
||||||
},
|
},
|
||||||
@@ -52,6 +65,9 @@
|
|||||||
"reskip": {
|
"reskip": {
|
||||||
"message": "继续跳过"
|
"message": "继续跳过"
|
||||||
},
|
},
|
||||||
|
"unmute": {
|
||||||
|
"message": "取消静音"
|
||||||
|
},
|
||||||
"paused": {
|
"paused": {
|
||||||
"message": "已暂停"
|
"message": "已暂停"
|
||||||
},
|
},
|
||||||
@@ -85,6 +101,9 @@
|
|||||||
"noVideoID": {
|
"noVideoID": {
|
||||||
"message": "未找到 YouTube 视频。\n如果识别错误,请刷新此页面。"
|
"message": "未找到 YouTube 视频。\n如果识别错误,请刷新此页面。"
|
||||||
},
|
},
|
||||||
|
"refreshSegments": {
|
||||||
|
"message": "刷新片段"
|
||||||
|
},
|
||||||
"success": {
|
"success": {
|
||||||
"message": "成功 !"
|
"message": "成功 !"
|
||||||
},
|
},
|
||||||
@@ -106,6 +125,9 @@
|
|||||||
"closePopup": {
|
"closePopup": {
|
||||||
"message": "关闭弹窗"
|
"message": "关闭弹窗"
|
||||||
},
|
},
|
||||||
|
"closeIcon": {
|
||||||
|
"message": "关闭图标"
|
||||||
|
},
|
||||||
"SubmitTimes": {
|
"SubmitTimes": {
|
||||||
"message": "提交片段"
|
"message": "提交片段"
|
||||||
},
|
},
|
||||||
@@ -155,6 +177,9 @@
|
|||||||
"setUsername": {
|
"setUsername": {
|
||||||
"message": "设定用户名"
|
"message": "设定用户名"
|
||||||
},
|
},
|
||||||
|
"copySegmentID": {
|
||||||
|
"message": "复制片段 ID"
|
||||||
|
},
|
||||||
"discordAdvert": {
|
"discordAdvert": {
|
||||||
"message": "快加入官方 Discord 服务器来提供建议与反馈!"
|
"message": "快加入官方 Discord 服务器来提供建议与反馈!"
|
||||||
},
|
},
|
||||||
@@ -179,6 +204,9 @@
|
|||||||
"hideInfoButton": {
|
"hideInfoButton": {
|
||||||
"message": "在 Youtube 播放器上隐藏信息按钮"
|
"message": "在 Youtube 播放器上隐藏信息按钮"
|
||||||
},
|
},
|
||||||
|
"autoHideInfoButton": {
|
||||||
|
"message": "自动隐藏信息按钮"
|
||||||
|
},
|
||||||
"hideDeleteButton": {
|
"hideDeleteButton": {
|
||||||
"message": "在 Youtube 播放器上隐藏删除按钮"
|
"message": "在 Youtube 播放器上隐藏删除按钮"
|
||||||
},
|
},
|
||||||
@@ -251,6 +279,13 @@
|
|||||||
"skip": {
|
"skip": {
|
||||||
"message": "跳过"
|
"message": "跳过"
|
||||||
},
|
},
|
||||||
|
"mute": {
|
||||||
|
"message": "静音"
|
||||||
|
},
|
||||||
|
"full": {
|
||||||
|
"message": "整个视频",
|
||||||
|
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||||
|
},
|
||||||
"skip_category": {
|
"skip_category": {
|
||||||
"message": "跳过{0}?"
|
"message": "跳过{0}?"
|
||||||
},
|
},
|
||||||
@@ -304,6 +339,9 @@
|
|||||||
"supportOtherSites": {
|
"supportOtherSites": {
|
||||||
"message": "支持第三方 YouTube 网站"
|
"message": "支持第三方 YouTube 网站"
|
||||||
},
|
},
|
||||||
|
"supportedSites": {
|
||||||
|
"message": "支持的站点: "
|
||||||
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "启用 Invidious 支持,禁用自动跳过,隐藏按钮等等。"
|
"message": "启用 Invidious 支持,禁用自动跳过,隐藏按钮等等。"
|
||||||
},
|
},
|
||||||
@@ -358,6 +396,15 @@
|
|||||||
"exportOptions": {
|
"exportOptions": {
|
||||||
"message": "导入/导出所有选项"
|
"message": "导入/导出所有选项"
|
||||||
},
|
},
|
||||||
|
"exportOptionsCopy": {
|
||||||
|
"message": "编辑/复制"
|
||||||
|
},
|
||||||
|
"exportOptionsDownload": {
|
||||||
|
"message": "保存到文件"
|
||||||
|
},
|
||||||
|
"exportOptionsUpload": {
|
||||||
|
"message": "从文件加载"
|
||||||
|
},
|
||||||
"setOptions": {
|
"setOptions": {
|
||||||
"message": "设定选项"
|
"message": "设定选项"
|
||||||
},
|
},
|
||||||
@@ -382,6 +429,9 @@
|
|||||||
"preview": {
|
"preview": {
|
||||||
"message": "预览"
|
"message": "预览"
|
||||||
},
|
},
|
||||||
|
"unsubmitted": {
|
||||||
|
"message": "未提交"
|
||||||
|
},
|
||||||
"inspect": {
|
"inspect": {
|
||||||
"message": "检查"
|
"message": "检查"
|
||||||
},
|
},
|
||||||
@@ -400,22 +450,38 @@
|
|||||||
"copyDebugInformationComplete": {
|
"copyDebugInformationComplete": {
|
||||||
"message": "调试信息已复制到剪切板中。 您可以随意移除任何您不想分享的信息。请将其另存为 .txt 文件或粘贴到错误报告中。"
|
"message": "调试信息已复制到剪切板中。 您可以随意移除任何您不想分享的信息。请将其另存为 .txt 文件或粘贴到错误报告中。"
|
||||||
},
|
},
|
||||||
|
"keyAlreadyUsed": {
|
||||||
|
"message": "此快捷键已绑定到另一个动作。请选择其他快捷键。"
|
||||||
|
},
|
||||||
"to": {
|
"to": {
|
||||||
"message": "到",
|
"message": "到",
|
||||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||||
},
|
},
|
||||||
|
"CopiedExclamation": {
|
||||||
|
"message": "复制成功!",
|
||||||
|
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
|
||||||
|
},
|
||||||
"category_sponsor": {
|
"category_sponsor": {
|
||||||
"message": "赞助商广告"
|
"message": "赞助商广告"
|
||||||
},
|
},
|
||||||
"category_sponsor_description": {
|
"category_sponsor_description": {
|
||||||
"message": "付费推广、付费推荐和直接广告。不应用于自我推广或免费提及、推荐他们喜欢的事物/创作者/网站/产品。"
|
"message": "付费推广、付费推荐和直接广告。不应用于自我推广或免费提及、推荐他们喜欢的事物/创作者/网站/产品。"
|
||||||
},
|
},
|
||||||
|
"category_sponsor_guideline1": {
|
||||||
|
"message": "付费推广"
|
||||||
|
},
|
||||||
|
"category_sponsor_guideline2": {
|
||||||
|
"message": "捐赠或自制周边不属于此项"
|
||||||
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "未收钱的/自我推销"
|
"message": "未收钱的/自我推销"
|
||||||
},
|
},
|
||||||
"category_selfpromo_description": {
|
"category_selfpromo_description": {
|
||||||
"message": "类似于 “赞助商广告” ,但为无报酬或自我推广。包括有关商品、捐赠的部分或合作者的信息。"
|
"message": "类似于 “赞助商广告” ,但为无报酬或自我推广。包括有关商品、捐赠的部分或合作者的信息。"
|
||||||
},
|
},
|
||||||
|
"category_selfpromo_guideline1": {
|
||||||
|
"message": "捐赠、会员和自制周边"
|
||||||
|
},
|
||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "互动提醒(订阅)"
|
"message": "互动提醒(订阅)"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -106,6 +106,8 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "time":
|
case "time":
|
||||||
|
case "infoUpdated":
|
||||||
|
case "videoChanged":
|
||||||
if (sender.tab) {
|
if (sender.tab) {
|
||||||
popupPort[sender.tab.id]?.postMessage(request);
|
popupPort[sender.tab.id]?.postMessage(request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -215,7 +215,6 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
|||||||
case "getVideoID":
|
case "getVideoID":
|
||||||
sendResponse({
|
sendResponse({
|
||||||
videoID: sponsorVideoID,
|
videoID: sponsorVideoID,
|
||||||
creatingSegment: isSegmentCreationInProgress(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -243,15 +242,9 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
|||||||
// update video on refresh if videoID invalid
|
// update video on refresh if videoID invalid
|
||||||
if (!sponsorVideoID) videoIDChange(getYouTubeVideoID(document));
|
if (!sponsorVideoID) videoIDChange(getYouTubeVideoID(document));
|
||||||
// fetch segments
|
// fetch segments
|
||||||
sponsorsLookup(false).then(() => sendResponse({
|
sponsorsLookup(false);
|
||||||
found: sponsorDataFound,
|
|
||||||
status: lastResponseStatus,
|
|
||||||
sponsorTimes: sponsorTimes,
|
|
||||||
time: video.currentTime,
|
|
||||||
onMobileYouTube
|
|
||||||
}));
|
|
||||||
|
|
||||||
return true;
|
break;
|
||||||
case "unskip":
|
case "unskip":
|
||||||
unskipSponsorTime(sponsorTimes.find((segment) => segment.UUID === request.UUID), null, true);
|
unskipSponsorTime(sponsorTimes.find((segment) => segment.UUID === request.UUID), null, true);
|
||||||
break;
|
break;
|
||||||
@@ -384,7 +377,7 @@ function resetValues() {
|
|||||||
categoryPill?.setVisibility(false);
|
categoryPill?.setVisibility(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function videoIDChange(id): Promise<void> {
|
async function videoIDChange(id: string): Promise<void> {
|
||||||
// don't switch to invalid value
|
// don't switch to invalid value
|
||||||
if (!id && sponsorVideoID && !document?.URL?.includes("youtube.com/clip/")) return;
|
if (!id && sponsorVideoID && !document?.URL?.includes("youtube.com/clip/")) return;
|
||||||
//if the id has not changed return unless the video element has changed
|
//if the id has not changed return unless the video element has changed
|
||||||
@@ -438,10 +431,14 @@ async function videoIDChange(id): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//close popup
|
// Notify the popup about the video change
|
||||||
closeInfoMenu();
|
chrome.runtime.sendMessage({
|
||||||
|
message: "videoChanged",
|
||||||
|
videoID: sponsorVideoID,
|
||||||
|
whitelisted: channelWhitelisted
|
||||||
|
});
|
||||||
|
|
||||||
sponsorsLookup(id);
|
sponsorsLookup();
|
||||||
|
|
||||||
// Make sure all player buttons are properly added
|
// Make sure all player buttons are properly added
|
||||||
updateVisibilityOfPlayerControlsButton();
|
updateVisibilityOfPlayerControlsButton();
|
||||||
@@ -1013,6 +1010,14 @@ async function sponsorsLookup(keepOldSubmissions = true) {
|
|||||||
?.sort((a, b) => a.segment[0] - b.segment[0]);
|
?.sort((a, b) => a.segment[0] - b.segment[0]);
|
||||||
if (!recievedSegments || !recievedSegments.length) {
|
if (!recievedSegments || !recievedSegments.length) {
|
||||||
// return if no video found
|
// return if no video found
|
||||||
|
chrome.runtime.sendMessage({
|
||||||
|
message: "infoUpdated",
|
||||||
|
found: false,
|
||||||
|
status: lastResponseStatus,
|
||||||
|
sponsorTimes: sponsorTimes,
|
||||||
|
time: video.currentTime,
|
||||||
|
onMobileYouTube
|
||||||
|
});
|
||||||
retryFetch(404);
|
retryFetch(404);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1102,6 +1107,16 @@ async function sponsorsLookup(keepOldSubmissions = true) {
|
|||||||
|
|
||||||
importExistingChapters(true);
|
importExistingChapters(true);
|
||||||
|
|
||||||
|
// notify popup of segment changes
|
||||||
|
chrome.runtime.sendMessage({
|
||||||
|
message: "infoUpdated",
|
||||||
|
found: sponsorDataFound,
|
||||||
|
status: lastResponseStatus,
|
||||||
|
sponsorTimes: sponsorTimes,
|
||||||
|
time: video.currentTime,
|
||||||
|
onMobileYouTube
|
||||||
|
});
|
||||||
|
|
||||||
if (Config.config.isVip) {
|
if (Config.config.isVip) {
|
||||||
lockedCategoriesLookup();
|
lockedCategoriesLookup();
|
||||||
}
|
}
|
||||||
@@ -1147,8 +1162,8 @@ async function lockedCategoriesLookup(): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function retryFetch(errorCode: number): void {
|
function retryFetch(errorCode: number): void {
|
||||||
if (!Config.config.refetchWhenNotFound) return;
|
|
||||||
sponsorDataFound = false;
|
sponsorDataFound = false;
|
||||||
|
if (!Config.config.refetchWhenNotFound) return;
|
||||||
|
|
||||||
if (retryFetchTimeout) clearTimeout(retryFetchTimeout);
|
if (retryFetchTimeout) clearTimeout(retryFetchTimeout);
|
||||||
if ((errorCode !== 404 && retryCount > 1) || (errorCode !== 404 && retryCount > 10)) {
|
if ((errorCode !== 404 && retryCount > 1) || (errorCode !== 404 && retryCount > 10)) {
|
||||||
@@ -1228,12 +1243,12 @@ function startSkipScheduleCheckingForStartSponsors() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getYouTubeVideoID(document: Document, url?: string): string | boolean {
|
function getYouTubeVideoID(document: Document, url?: string): string {
|
||||||
url ||= document.URL;
|
url ||= document.URL;
|
||||||
// pageType shortcut
|
// pageType shortcut
|
||||||
if (pageType === PageType.Channel) return getYouTubeVideoIDFromDocument()
|
if (pageType === PageType.Channel) return getYouTubeVideoIDFromDocument();
|
||||||
// clips should never skip, going from clip to full video has no indications.
|
// clips should never skip, going from clip to full video has no indications.
|
||||||
if (url.includes("youtube.com/clip/")) return false;
|
if (url.includes("youtube.com/clip/")) return null;
|
||||||
// skip to document and don't hide if on /embed/
|
// skip to document and don't hide if on /embed/
|
||||||
if (url.includes("/embed/") && url.includes("youtube.com")) return getYouTubeVideoIDFromDocument(false, PageType.Embed);
|
if (url.includes("/embed/") && url.includes("youtube.com")) return getYouTubeVideoIDFromDocument(false, PageType.Embed);
|
||||||
// skip to URL if matches youtube watch or invidious or matches youtube pattern
|
// skip to URL if matches youtube watch or invidious or matches youtube pattern
|
||||||
@@ -1244,7 +1259,7 @@ function getYouTubeVideoID(document: Document, url?: string): string | boolean {
|
|||||||
return getYouTubeVideoIDFromURL(url) || getYouTubeVideoIDFromDocument(false);
|
return getYouTubeVideoIDFromURL(url) || getYouTubeVideoIDFromDocument(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getYouTubeVideoIDFromDocument(hideIcon = true, pageHint = PageType.Watch): string | boolean {
|
function getYouTubeVideoIDFromDocument(hideIcon = true, pageHint = PageType.Watch): string {
|
||||||
const selector = "a.ytp-title-link[data-sessionlink='feature=player-title']";
|
const selector = "a.ytp-title-link[data-sessionlink='feature=player-title']";
|
||||||
// get ID from document (channel trailer / embedded playlist)
|
// get ID from document (channel trailer / embedded playlist)
|
||||||
const element = pageHint === PageType.Embed ? document.querySelector(selector)
|
const element = pageHint === PageType.Embed ? document.querySelector(selector)
|
||||||
@@ -1256,11 +1271,11 @@ function getYouTubeVideoIDFromDocument(hideIcon = true, pageHint = PageType.Watc
|
|||||||
pageType = pageHint;
|
pageType = pageHint;
|
||||||
return getYouTubeVideoIDFromURL(videoURL);
|
return getYouTubeVideoIDFromURL(videoURL);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getYouTubeVideoIDFromURL(url: string): string | boolean {
|
function getYouTubeVideoIDFromURL(url: string): string {
|
||||||
if(url.startsWith("https://www.youtube.com/tv#/")) url = url.replace("#", "");
|
if(url.startsWith("https://www.youtube.com/tv#/")) url = url.replace("#", "");
|
||||||
|
|
||||||
//Attempt to parse url
|
//Attempt to parse url
|
||||||
@@ -1269,7 +1284,7 @@ function getYouTubeVideoIDFromURL(url: string): string | boolean {
|
|||||||
urlObject = new URL(url);
|
urlObject = new URL(url);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("[SB] Unable to parse URL: " + url);
|
console.error("[SB] Unable to parse URL: " + url);
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if valid hostname
|
// Check if valid hostname
|
||||||
@@ -1283,7 +1298,7 @@ function getYouTubeVideoIDFromURL(url: string): string | boolean {
|
|||||||
utils.wait(() => Config.config !== null).then(() => videoIDChange(getYouTubeVideoIDFromURL(url)));
|
utils.wait(() => Config.config !== null).then(() => videoIDChange(getYouTubeVideoIDFromURL(url)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
onInvidious = false;
|
onInvidious = false;
|
||||||
}
|
}
|
||||||
@@ -1291,17 +1306,17 @@ function getYouTubeVideoIDFromURL(url: string): string | boolean {
|
|||||||
//Get ID from searchParam
|
//Get ID from searchParam
|
||||||
if (urlObject.searchParams.has("v") && ["/watch", "/watch/"].includes(urlObject.pathname) || urlObject.pathname.startsWith("/tv/watch")) {
|
if (urlObject.searchParams.has("v") && ["/watch", "/watch/"].includes(urlObject.pathname) || urlObject.pathname.startsWith("/tv/watch")) {
|
||||||
const id = urlObject.searchParams.get("v");
|
const id = urlObject.searchParams.get("v");
|
||||||
return id.length == 11 ? id : false;
|
return id.length == 11 ? id : null;
|
||||||
} else if (urlObject.pathname.startsWith("/embed/") || urlObject.pathname.startsWith("/shorts/")) {
|
} else if (urlObject.pathname.startsWith("/embed/") || urlObject.pathname.startsWith("/shorts/")) {
|
||||||
try {
|
try {
|
||||||
const id = urlObject.pathname.split("/")[2]
|
const id = urlObject.pathname.split("/")[2]
|
||||||
if (id?.length >=11 ) return id.slice(0, 11);
|
if (id?.length >=11 ) return id.slice(0, 11);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("[SB] Video ID not valid for " + url);
|
console.error("[SB] Video ID not valid for " + url);
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1803,7 +1818,8 @@ async function updateVisibilityOfPlayerControlsButton(): Promise<void> {
|
|||||||
updateEditButtonsOnPlayer();
|
updateEditButtonsOnPlayer();
|
||||||
|
|
||||||
// Don't show the info button on embeds
|
// Don't show the info button on embeds
|
||||||
if (Config.config.hideInfoButtonPlayerControls || document.URL.includes("/embed/") || onInvidious) {
|
if (Config.config.hideInfoButtonPlayerControls || document.URL.includes("/embed/") || onInvidious
|
||||||
|
|| document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||||
playerButtons.info.button.style.display = "none";
|
playerButtons.info.button.style.display = "none";
|
||||||
} else {
|
} else {
|
||||||
playerButtons.info.button.style.removeProperty("display");
|
playerButtons.info.button.style.removeProperty("display");
|
||||||
|
|||||||
@@ -83,15 +83,15 @@ interface GetVideoIdResponse {
|
|||||||
videoID: string;
|
videoID: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface GetChannelIDResponse {
|
export interface GetChannelIDResponse {
|
||||||
channelID: string;
|
channelID: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SponsorStartResponse {
|
export interface SponsorStartResponse {
|
||||||
creatingSegment: boolean;
|
creatingSegment: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IsChannelWhitelistedResponse {
|
export interface IsChannelWhitelistedResponse {
|
||||||
value: boolean;
|
value: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ export interface VoteResponse {
|
|||||||
responseText: string;
|
responseText: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ImportSegmentsResponse {
|
interface ImportSegmentsResponse {
|
||||||
importedSegments: SponsorTime[];
|
importedSegments: SponsorTime[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,4 +120,14 @@ export interface TimeUpdateMessage {
|
|||||||
time: number;
|
time: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type PopupMessage = TimeUpdateMessage;
|
export type InfoUpdatedMessage = IsInfoFoundMessageResponse & {
|
||||||
|
message: "infoUpdated";
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface VideoChangedPopupMessage {
|
||||||
|
message: "videoChanged";
|
||||||
|
videoID: string;
|
||||||
|
whitelisted: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PopupMessage = TimeUpdateMessage | InfoUpdatedMessage | VideoChangedPopupMessage;
|
||||||
|
|||||||
416
src/popup.ts
416
src/popup.ts
@@ -1,8 +1,24 @@
|
|||||||
import Config from "./config";
|
import Config from "./config";
|
||||||
|
|
||||||
import Utils from "./utils";
|
import Utils from "./utils";
|
||||||
import { SponsorTime, SponsorHideType, ActionType, SegmentUUID, SponsorSourceType, StorageChangesObject } from "./types";
|
import {
|
||||||
import { Message, MessageResponse, IsInfoFoundMessageResponse, ImportSegmentsResponse, PopupMessage } from "./messageTypes";
|
ActionType,
|
||||||
|
SegmentUUID,
|
||||||
|
SponsorHideType,
|
||||||
|
SponsorSourceType,
|
||||||
|
SponsorTime,
|
||||||
|
StorageChangesObject,
|
||||||
|
} from "./types";
|
||||||
|
import {
|
||||||
|
GetChannelIDResponse,
|
||||||
|
IsChannelWhitelistedResponse,
|
||||||
|
IsInfoFoundMessageResponse,
|
||||||
|
Message,
|
||||||
|
MessageResponse,
|
||||||
|
PopupMessage,
|
||||||
|
SponsorStartResponse,
|
||||||
|
VoteResponse,
|
||||||
|
} from "./messageTypes";
|
||||||
import { showDonationLink } from "./utils/configUtils";
|
import { showDonationLink } from "./utils/configUtils";
|
||||||
import { AnimationUtils } from "./utils/animationUtils";
|
import { AnimationUtils } from "./utils/animationUtils";
|
||||||
import { GenericUtils } from "./utils/genericUtils";
|
import { GenericUtils } from "./utils/genericUtils";
|
||||||
@@ -11,6 +27,7 @@ import { localizeHtmlPage } from "./utils/pageUtils";
|
|||||||
import { exportTimes } from "./utils/exporter";
|
import { exportTimes } from "./utils/exporter";
|
||||||
import GenericNotice from "./render/GenericNotice";
|
import GenericNotice from "./render/GenericNotice";
|
||||||
import { noRefreshFetchingChaptersAllowed } from "./utils/licenseKey";
|
import { noRefreshFetchingChaptersAllowed } from "./utils/licenseKey";
|
||||||
|
|
||||||
const utils = new Utils();
|
const utils = new Utils();
|
||||||
|
|
||||||
interface MessageListener {
|
interface MessageListener {
|
||||||
@@ -67,8 +84,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
};
|
};
|
||||||
type PageElements = { [key: string]: HTMLElement } & InputPageElements
|
type PageElements = { [key: string]: HTMLElement } & InputPageElements
|
||||||
|
|
||||||
/** If true, the content script is in the process of creating a new segment. */
|
let stopLoadingAnimation = null;
|
||||||
let creatingSegment = false;
|
|
||||||
|
|
||||||
//the start and end time pairs (2d)
|
//the start and end time pairs (2d)
|
||||||
let sponsorTimes: SponsorTime[] = [];
|
let sponsorTimes: SponsorTime[] = [];
|
||||||
@@ -376,7 +392,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
messageHandler.sendMessage(tabs[0].id, { message: 'getVideoID' }, function (result) {
|
messageHandler.sendMessage(tabs[0].id, { message: 'getVideoID' }, function (result) {
|
||||||
if (result !== undefined && result.videoID) {
|
if (result !== undefined && result.videoID) {
|
||||||
currentVideoID = result.videoID;
|
currentVideoID = result.videoID;
|
||||||
creatingSegment = result.creatingSegment;
|
|
||||||
|
|
||||||
loadTabData(tabs, updating);
|
loadTabData(tabs, updating);
|
||||||
} else if (result === undefined && chrome.runtime.lastError) {
|
} else if (result === undefined && chrome.runtime.lastError) {
|
||||||
@@ -411,7 +426,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
}, (tabs) => onTabs(tabs, updating));
|
}, (tabs) => onTabs(tabs, updating));
|
||||||
}
|
}
|
||||||
|
|
||||||
function infoFound(request: IsInfoFoundMessageResponse) {
|
async function infoFound(request: IsInfoFoundMessageResponse) {
|
||||||
|
// End any loading animation
|
||||||
|
if (stopLoadingAnimation != null) {
|
||||||
|
stopLoadingAnimation();
|
||||||
|
stopLoadingAnimation = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (chrome.runtime.lastError) {
|
if (chrome.runtime.lastError) {
|
||||||
//This page doesn't have the injected content script, or at least not yet
|
//This page doesn't have the injected content script, or at least not yet
|
||||||
displayNoVideo();
|
displayNoVideo();
|
||||||
@@ -427,13 +448,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
PageElements.loadingIndicator.style.display = "none";
|
PageElements.loadingIndicator.style.display = "none";
|
||||||
|
|
||||||
downloadedTimes = request.sponsorTimes ?? [];
|
downloadedTimes = request.sponsorTimes ?? [];
|
||||||
|
displayDownloadedSponsorTimes(downloadedTimes, request.time);
|
||||||
if (request.found) {
|
if (request.found) {
|
||||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
|
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
|
||||||
|
|
||||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||||
if (request.sponsorTimes) {
|
|
||||||
displayDownloadedSponsorTimes(request.sponsorTimes, request.time);
|
|
||||||
}
|
|
||||||
} else if (request.status == 404 || request.status == 200) {
|
} else if (request.status == 404 || request.status == 200) {
|
||||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
|
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
|
||||||
PageElements.issueReporterImportExport.classList.remove("hidden");
|
PageElements.issueReporterImportExport.classList.remove("hidden");
|
||||||
@@ -444,62 +462,40 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//see if whitelist button should be swapped
|
//see if whitelist button should be swapped
|
||||||
messageHandler.query({
|
const response = await sendTabMessageAsync({ message: 'isChannelWhitelisted' }) as IsChannelWhitelistedResponse;
|
||||||
active: true,
|
if (response.value) {
|
||||||
currentWindow: true
|
PageElements.whitelistChannel.style.display = "none";
|
||||||
}, tabs => {
|
PageElements.unwhitelistChannel.style.display = "unset";
|
||||||
messageHandler.sendMessage(
|
PageElements.whitelistToggle.checked = true;
|
||||||
tabs[0].id,
|
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
|
||||||
{ message: 'isChannelWhitelisted' },
|
|
||||||
function (response) {
|
|
||||||
if (response.value) {
|
|
||||||
PageElements.whitelistChannel.style.display = "none";
|
|
||||||
PageElements.unwhitelistChannel.style.display = "unset";
|
|
||||||
PageElements.whitelistToggle.checked = true;
|
|
||||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendSponsorStartMessage() {
|
async function sendSponsorStartMessage() {
|
||||||
//the content script will get the message if a YouTube page is open
|
//the content script will get the message if a YouTube page is open
|
||||||
messageHandler.query({
|
const response = await sendTabMessageAsync({ from: 'popup', message: 'sponsorStart' }) as SponsorStartResponse;
|
||||||
active: true,
|
startSponsorCallback(response);
|
||||||
currentWindow: true,
|
|
||||||
}, (tabs) => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id,
|
|
||||||
{ from: 'popup', message: 'sponsorStart' },
|
|
||||||
async (response) => {
|
|
||||||
startSponsorCallback(response);
|
|
||||||
|
|
||||||
// Perform a second update after the config changes take effect as a workaround for a race condition
|
// Perform a second update after the config changes take effect as a workaround for a race condition
|
||||||
const removeListener = (listener: typeof lateUpdate) => {
|
const removeListener = (listener: typeof lateUpdate) => {
|
||||||
const index = Config.configSyncListeners.indexOf(listener);
|
const index = Config.configSyncListeners.indexOf(listener);
|
||||||
if (index !== -1) Config.configSyncListeners.splice(index, 1);
|
if (index !== -1) Config.configSyncListeners.splice(index, 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
const lateUpdate = () => {
|
const lateUpdate = () => {
|
||||||
startSponsorCallback(response);
|
startSponsorCallback(response);
|
||||||
removeListener(lateUpdate);
|
removeListener(lateUpdate);
|
||||||
};
|
};
|
||||||
|
|
||||||
Config.configSyncListeners.push(lateUpdate);
|
Config.configSyncListeners.push(lateUpdate);
|
||||||
|
|
||||||
// Remove the listener after 200ms in case the changes were propagated by the time we got the response
|
// Remove the listener after 200ms in case the changes were propagated by the time we got the response
|
||||||
setTimeout(() => removeListener(lateUpdate), 200);
|
setTimeout(() => removeListener(lateUpdate), 200);
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function startSponsorCallback(response: { creatingSegment: boolean }) {
|
function startSponsorCallback(response: SponsorStartResponse) {
|
||||||
creatingSegment = response.creatingSegment;
|
|
||||||
|
|
||||||
// Only update the segments after a segment was created
|
// Only update the segments after a segment was created
|
||||||
if (!creatingSegment) {
|
if (!response.creatingSegment) {
|
||||||
sponsorTimes = Config.config.unsubmittedSegments[currentVideoID] || [];
|
sponsorTimes = Config.config.unsubmittedSegments[currentVideoID] || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,19 +672,11 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
downloadedTimes[i].hidden = SponsorHideType.Hidden;
|
downloadedTimes[i].hidden = SponsorHideType.Hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
messageHandler.query({
|
sendTabMessage({
|
||||||
active: true,
|
message: "hideSegment",
|
||||||
currentWindow: true
|
type: downloadedTimes[i].hidden,
|
||||||
}, tabs => {
|
UUID: UUID
|
||||||
messageHandler.sendMessage(
|
})
|
||||||
tabs[0].id,
|
|
||||||
{
|
|
||||||
message: "hideSegment",
|
|
||||||
type: downloadedTimes[i].hidden,
|
|
||||||
UUID: UUID
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const skipButton = document.createElement("img");
|
const skipButton = document.createElement("img");
|
||||||
@@ -733,15 +721,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
|
|
||||||
function submitTimes() {
|
function submitTimes() {
|
||||||
if (sponsorTimes.length > 0) {
|
if (sponsorTimes.length > 0) {
|
||||||
messageHandler.query({
|
sendTabMessage({ message: 'submitTimes' })
|
||||||
active: true,
|
|
||||||
currentWindow: true
|
|
||||||
}, tabs => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id,
|
|
||||||
{ message: 'submitTimes' },
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -751,9 +731,16 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
PageElements.showNoticeAgain.style.display = "none";
|
PageElements.showNoticeAgain.style.display = "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isCreatingSegment(): boolean {
|
||||||
|
const segments = Config.config.unsubmittedSegments[currentVideoID];
|
||||||
|
if (!segments) return false;
|
||||||
|
const lastSegment = segments[segments.length - 1];
|
||||||
|
return lastSegment && lastSegment?.segment?.length !== 2;
|
||||||
|
}
|
||||||
|
|
||||||
/** Updates any UI related to segment editing and submission according to the current state. */
|
/** Updates any UI related to segment editing and submission according to the current state. */
|
||||||
function updateSegmentEditingUI() {
|
function updateSegmentEditingUI() {
|
||||||
PageElements.sponsorStart.innerText = chrome.i18n.getMessage(creatingSegment ? "sponsorEnd" : "sponsorStart");
|
PageElements.sponsorStart.innerText = chrome.i18n.getMessage(isCreatingSegment() ? "sponsorEnd" : "sponsorStart");
|
||||||
|
|
||||||
PageElements.submitTimes.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
PageElements.submitTimes.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
||||||
PageElements.submissionHint.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
PageElements.submissionHint.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
||||||
@@ -772,20 +759,22 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
chrome.runtime.sendMessage({ "message": "openHelp" });
|
chrome.runtime.sendMessage({ "message": "openHelp" });
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendTabMessage(data: Message): Promise<unknown> {
|
function sendTabMessage(data: Message, callback?) {
|
||||||
return new Promise((resolve) => {
|
messageHandler.query({
|
||||||
messageHandler.query({
|
active: true,
|
||||||
active: true,
|
currentWindow: true
|
||||||
currentWindow: true
|
}, tabs => {
|
||||||
}, tabs => {
|
messageHandler.sendMessage(
|
||||||
messageHandler.sendMessage(
|
tabs[0].id,
|
||||||
tabs[0].id,
|
data,
|
||||||
data,
|
callback
|
||||||
(response) => resolve(response)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendTabMessageAsync(data: Message): Promise<unknown> {
|
||||||
|
return new Promise((resolve) => sendTabMessage(data, (response) => resolve(response)))
|
||||||
}
|
}
|
||||||
|
|
||||||
//make the options username setting option visible
|
//make the options username setting option visible
|
||||||
@@ -862,163 +851,111 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
thanksForVotingText.removeAttribute("innerText");
|
thanksForVotingText.removeAttribute("innerText");
|
||||||
}
|
}
|
||||||
|
|
||||||
function vote(type, UUID) {
|
async function vote(type, UUID) {
|
||||||
//add loading info
|
//add loading info
|
||||||
addVoteMessage(chrome.i18n.getMessage("Loading"), UUID);
|
addVoteMessage(chrome.i18n.getMessage("Loading"), UUID);
|
||||||
|
const response = await sendTabMessageAsync({
|
||||||
|
message: "submitVote",
|
||||||
|
type: type,
|
||||||
|
UUID: UUID
|
||||||
|
}) as VoteResponse;
|
||||||
|
|
||||||
messageHandler.query({
|
if (response != undefined) {
|
||||||
active: true,
|
//see if it was a success or failure
|
||||||
currentWindow: true
|
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||||
}, tabs => {
|
//success (treat rate limits as a success)
|
||||||
messageHandler.sendMessage(
|
addVoteMessage(chrome.i18n.getMessage("voted"), UUID);
|
||||||
tabs[0].id,
|
} else if (response.successType == -1) {
|
||||||
{
|
addVoteMessage(GenericUtils.getErrorMessage(response.statusCode, response.responseText), UUID);
|
||||||
message: "submitVote",
|
}
|
||||||
type: type,
|
setTimeout(() => removeVoteMessage(UUID), 1500);
|
||||||
UUID: UUID
|
}
|
||||||
}, function (response) {
|
}
|
||||||
if (response != undefined) {
|
|
||||||
//see if it was a success or failure
|
async function whitelistChannel() {
|
||||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
//get the channel url
|
||||||
//success (treat rate limits as a success)
|
const response = await sendTabMessageAsync({ message: 'getChannelID' }) as GetChannelIDResponse;
|
||||||
addVoteMessage(chrome.i18n.getMessage("voted"), UUID);
|
if (!response.channelID) {
|
||||||
} else if (response.successType == -1) {
|
alert(chrome.i18n.getMessage("channelDataNotFound") + " https://github.com/ajayyy/SponsorBlock/issues/753");
|
||||||
addVoteMessage(GenericUtils.getErrorMessage(response.statusCode, response.responseText), UUID);
|
return;
|
||||||
}
|
}
|
||||||
setTimeout(() => removeVoteMessage(UUID), 1500);
|
|
||||||
}
|
//get whitelisted channels
|
||||||
}
|
let whitelistedChannels = Config.config.whitelistedChannels;
|
||||||
);
|
if (whitelistedChannels == undefined) {
|
||||||
|
whitelistedChannels = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
//add on this channel
|
||||||
|
whitelistedChannels.push(response.channelID);
|
||||||
|
|
||||||
|
//change button
|
||||||
|
PageElements.whitelistChannel.style.display = "none";
|
||||||
|
PageElements.unwhitelistChannel.style.display = "unset";
|
||||||
|
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
|
||||||
|
|
||||||
|
//show 'consider force channel check' alert
|
||||||
|
if (!Config.config.forceChannelCheck) PageElements.whitelistForceCheck.classList.remove("hidden");
|
||||||
|
|
||||||
|
//save this
|
||||||
|
Config.config.whitelistedChannels = whitelistedChannels;
|
||||||
|
|
||||||
|
//send a message to the client
|
||||||
|
sendTabMessage({
|
||||||
|
message: 'whitelistChange',
|
||||||
|
value: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function whitelistChannel() {
|
async function unwhitelistChannel() {
|
||||||
//get the channel url
|
//get the channel url
|
||||||
messageHandler.query({
|
const response = await sendTabMessageAsync({ message: 'getChannelID' }) as GetChannelIDResponse;
|
||||||
active: true,
|
|
||||||
currentWindow: true
|
|
||||||
}, tabs => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id,
|
|
||||||
{ message: 'getChannelID' },
|
|
||||||
function (response) {
|
|
||||||
if (!response.channelID) {
|
|
||||||
alert(chrome.i18n.getMessage("channelDataNotFound") + " https://github.com/ajayyy/SponsorBlock/issues/753");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//get whitelisted channels
|
//get whitelisted channels
|
||||||
let whitelistedChannels = Config.config.whitelistedChannels;
|
let whitelistedChannels = Config.config.whitelistedChannels;
|
||||||
if (whitelistedChannels == undefined) {
|
if (whitelistedChannels == undefined) {
|
||||||
whitelistedChannels = [];
|
whitelistedChannels = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
//add on this channel
|
//remove this channel
|
||||||
whitelistedChannels.push(response.channelID);
|
const index = whitelistedChannels.indexOf(response.channelID);
|
||||||
|
whitelistedChannels.splice(index, 1);
|
||||||
|
|
||||||
//change button
|
//change button
|
||||||
PageElements.whitelistChannel.style.display = "none";
|
PageElements.whitelistChannel.style.display = "unset";
|
||||||
PageElements.unwhitelistChannel.style.display = "unset";
|
PageElements.unwhitelistChannel.style.display = "none";
|
||||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
|
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
|
||||||
|
|
||||||
//show 'consider force channel check' alert
|
//hide 'consider force channel check' alert
|
||||||
if (!Config.config.forceChannelCheck) PageElements.whitelistForceCheck.classList.remove("hidden");
|
PageElements.whitelistForceCheck.classList.add("hidden");
|
||||||
|
|
||||||
//save this
|
//save this
|
||||||
Config.config.whitelistedChannels = whitelistedChannels;
|
Config.config.whitelistedChannels = whitelistedChannels;
|
||||||
|
|
||||||
//send a message to the client
|
//send a message to the client
|
||||||
messageHandler.query({
|
sendTabMessage({
|
||||||
active: true,
|
message: 'whitelistChange',
|
||||||
currentWindow: true
|
value: false
|
||||||
}, tabs => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id, {
|
|
||||||
message: 'whitelistChange',
|
|
||||||
value: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function unwhitelistChannel() {
|
function startLoadingAnimation() {
|
||||||
//get the channel url
|
stopLoadingAnimation = AnimationUtils.applyLoadingAnimation(PageElements.refreshSegmentsButton, 0.3);
|
||||||
messageHandler.query({
|
|
||||||
active: true,
|
|
||||||
currentWindow: true
|
|
||||||
}, tabs => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id,
|
|
||||||
{ message: 'getChannelID' },
|
|
||||||
function (response) {
|
|
||||||
//get whitelisted channels
|
|
||||||
let whitelistedChannels = Config.config.whitelistedChannels;
|
|
||||||
if (whitelistedChannels == undefined) {
|
|
||||||
whitelistedChannels = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
//remove this channel
|
|
||||||
const index = whitelistedChannels.indexOf(response.channelID);
|
|
||||||
whitelistedChannels.splice(index, 1);
|
|
||||||
|
|
||||||
//change button
|
|
||||||
PageElements.whitelistChannel.style.display = "unset";
|
|
||||||
PageElements.unwhitelistChannel.style.display = "none";
|
|
||||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
|
|
||||||
|
|
||||||
//hide 'consider force channel check' alert
|
|
||||||
PageElements.whitelistForceCheck.classList.add("hidden");
|
|
||||||
|
|
||||||
//save this
|
|
||||||
Config.config.whitelistedChannels = whitelistedChannels;
|
|
||||||
|
|
||||||
//send a message to the client
|
|
||||||
messageHandler.query({
|
|
||||||
active: true,
|
|
||||||
currentWindow: true
|
|
||||||
}, tabs => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id, {
|
|
||||||
message: 'whitelistChange',
|
|
||||||
value: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshSegments() {
|
function refreshSegments() {
|
||||||
const stopAnimation = AnimationUtils.applyLoadingAnimation(PageElements.refreshSegmentsButton, 0.3);
|
startLoadingAnimation();
|
||||||
|
sendTabMessage({ message: 'refreshSegments' });
|
||||||
messageHandler.query({
|
|
||||||
active: true,
|
|
||||||
currentWindow: true
|
|
||||||
}, tabs => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id,
|
|
||||||
{ message: 'refreshSegments' },
|
|
||||||
(response) => {
|
|
||||||
infoFound(response);
|
|
||||||
stopAnimation();
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function skipSegment(actionType: ActionType, UUID: SegmentUUID, element?: HTMLElement): void {
|
function skipSegment(actionType: ActionType, UUID: SegmentUUID, element?: HTMLElement): void {
|
||||||
if (actionType === ActionType.Chapter) {
|
if (actionType === ActionType.Chapter) {
|
||||||
sendMessage({
|
sendTabMessage({
|
||||||
message: "unskip",
|
message: "unskip",
|
||||||
UUID: UUID
|
UUID: UUID
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
sendMessage({
|
sendTabMessage({
|
||||||
message: "reskip",
|
message: "reskip",
|
||||||
UUID: UUID
|
UUID: UUID
|
||||||
});
|
});
|
||||||
@@ -1030,18 +967,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendMessage(request: Message): void {
|
|
||||||
messageHandler.query({
|
|
||||||
active: true,
|
|
||||||
currentWindow: true
|
|
||||||
}, tabs => {
|
|
||||||
messageHandler.sendMessage(
|
|
||||||
tabs[0].id,
|
|
||||||
request
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should skipping be disabled (visuals stay)
|
* Should skipping be disabled (visuals stay)
|
||||||
*/
|
*/
|
||||||
@@ -1074,10 +999,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
async function importSegments() {
|
async function importSegments() {
|
||||||
const text = (PageElements.importSegmentsText as HTMLInputElement).value;
|
const text = (PageElements.importSegmentsText as HTMLInputElement).value;
|
||||||
|
|
||||||
await sendTabMessage({
|
sendTabMessage({
|
||||||
message: "importSegments",
|
message: "importSegments",
|
||||||
data: text
|
data: text
|
||||||
}) as ImportSegmentsResponse;
|
});
|
||||||
|
|
||||||
PageElements.importSegmentsMenu.classList.add("hidden");
|
PageElements.importSegmentsMenu.classList.add("hidden");
|
||||||
}
|
}
|
||||||
@@ -1142,6 +1067,27 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
|||||||
case "time":
|
case "time":
|
||||||
displayDownloadedSponsorTimes(downloadedTimes, msg.time);
|
displayDownloadedSponsorTimes(downloadedTimes, msg.time);
|
||||||
break;
|
break;
|
||||||
|
case "infoUpdated":
|
||||||
|
infoFound(msg);
|
||||||
|
break;
|
||||||
|
case "videoChanged":
|
||||||
|
currentVideoID = msg.videoID
|
||||||
|
sponsorTimes = Config.config.unsubmittedSegments[currentVideoID] ?? [];
|
||||||
|
updateSegmentEditingUI();
|
||||||
|
|
||||||
|
if (msg.whitelisted) {
|
||||||
|
PageElements.whitelistChannel.style.display = "none";
|
||||||
|
PageElements.unwhitelistChannel.style.display = "unset";
|
||||||
|
PageElements.whitelistToggle.checked = true;
|
||||||
|
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear segments list & start loading animation
|
||||||
|
// We'll get a ping once they're loaded
|
||||||
|
startLoadingAnimation();
|
||||||
|
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("Loading");
|
||||||
|
displayDownloadedSponsorTimes([], 0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user