Compare commits

...

52 Commits

Author SHA1 Message Date
Ajay Ramachandran
ba575f6b8d Merge pull request #296 from ajayyy/experimental
Prevent manual skips from triggering a view and improved skip schedule for manual skip
2020-03-09 18:20:11 -04:00
Ajay Ramachandran
ff9b2338e0 Fixed scheduling being wrong when manual skip is enabled 2020-03-09 18:12:05 -04:00
Ajay Ramachandran
d2bb4b38e3 Increased version number 2020-03-09 18:07:29 -04:00
Ajay Ramachandran
760c08dd0c Prevent manual skips from triggering a view 2020-03-09 18:07:06 -04:00
Ajay Ramachandran
50517eb462 Switched upload to release action 2020-03-09 11:15:29 -04:00
Ajay Ramachandran
e77425c21e Merge pull request #294 from ajayyy/experimental
Another potential fix for zero second sponsor freezing
2020-03-09 11:04:26 -04:00
Ajay Ramachandran
f63abb053d Revert to only using workflows 2020-03-09 11:02:14 -04:00
Ajay Ramachandran
7b5703aa04 Fixed action format 2020-03-09 10:56:06 -04:00
Ajay Ramachandran
d641066312 Checkout in CI 2020-03-09 10:52:43 -04:00
Ajay Ramachandran
44ca8d47d8 Moved CI into the right place 2020-03-09 10:51:26 -04:00
Ajay Ramachandran
d5f41bf4ad Fixed CI 2020-03-09 10:49:50 -04:00
Ajay Ramachandran
73e8926444 Start skip schedule from skip time to prevent slow video updates from breaking it. 2020-03-09 10:43:13 -04:00
Ajay Ramachandran
5ad694af65 Increase version number 2020-03-08 23:26:46 -04:00
Ajay Ramachandran
d7f7acb219 Fixed release action 2020-03-08 23:20:41 -04:00
Ajay Ramachandran
b4be51333a Merge pull request #293 from ajayyy/experimental
Fixed double sponsor skip for zero second sponsors
2020-03-08 23:17:48 -04:00
Ajay Ramachandran
ae94811a00 Increase version number 2020-03-08 23:16:50 -04:00
Ajay Ramachandran
a484f2f2cc Fixed double sponsor skip for zero second sponsors 2020-03-08 23:16:09 -04:00
Ajay Ramachandran
9cce4e734d Merge pull request #292 from grishka/russian
Fix Russian translation and add missing strings
2020-03-07 12:34:48 -05:00
Grishka
3c63644213 fix 2020-03-07 13:45:56 +03:00
Grishka
ad25bc34de Add missing Russian strings 2020-03-07 13:37:58 +03:00
Ajay Ramachandran
0241e15691 Only seek if the video is not paused 2020-02-28 15:06:08 -05:00
Ajay Ramachandran
af9a6b8a84 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into experimental 2020-02-28 14:09:21 -05:00
Ajay Ramachandran
329b188435 Checkout before using other CI 2020-02-27 22:23:33 -05:00
Ajay Ramachandran
2e49bb73c5 Merge pull request #290 from ajayyy/experimental
Potentially fixed zero second skip spam
2020-02-27 22:21:33 -05:00
Ajay Ramachandran
5158020293 Potentially fixed zero second skip spam 2020-02-27 22:20:30 -05:00
Ajay Ramachandran
feaf80ad1e Merge pull request #289 from Joe-Dowd/messages-typo
Typo in en messages locale "skipeed -> skipped"
2020-02-25 15:14:01 -05:00
Joe Dowd
7fbd89159e Typo in en messages locale skipped 2020-02-25 18:25:28 +00:00
Ajay Ramachandran
716861da18 Fixed beta builds 2020-02-23 20:49:17 -05:00
Ajay Ramachandran
d0a34d423c Fix release CI 2020-02-23 20:42:12 -05:00
Ajay Ramachandran
adfba72f19 Merge pull request #286 from ajayyy/experimental
Mobile fix + mobile update notice
2020-02-23 20:40:48 -05:00
Ajay Ramachandran
f00337c376 Increase version number. 2020-02-23 20:39:29 -05:00
Ajay Ramachandran
737a023b65 Added mobile support message. 2020-02-23 20:39:13 -05:00
Ajay Ramachandran
5551344355 Fixed mobile notice zoom on Firefox 2020-02-23 16:14:18 -05:00
Ajay Ramachandran
07f64382fb Merge pull request #285 from cherryblossom000/patch-1
Fix "0 sponsor" in popup
2020-02-23 11:21:21 -05:00
Ajay Ramachandran
1c7cde2a19 Changed to !== 2020-02-23 11:20:21 -05:00
cherryblossom
8510a7f3d8 Fix popup saying "0 sponsor" 2020-02-23 17:03:18 +11:00
Ajay Ramachandran
db60b11a17 Merge pull request #284 from ajayyy/experimental
CI Improvements
2020-02-20 15:38:35 -05:00
Ajay Ramachandran
6a212b762a Fixed invalid release workflow 2020-02-20 12:21:30 -05:00
Ajay Ramachandran
c8ec2922cf Added makedir to CI 2020-02-20 12:17:51 -05:00
Ajay Ramachandran
b629b7d333 Added basic release workflow 2020-02-20 12:14:01 -05:00
Ajay Ramachandran
514a8b62d6 Added beta build to CI 2020-02-20 11:39:06 -05:00
Ajay Ramachandran
cd11618a5d Merge pull request #283 from ajayyy/experimental
New skipping mechanism fixes
2020-02-20 11:25:32 -05:00
Ajay Ramachandran
8be3cb157a Increased version number 2020-02-20 11:23:44 -05:00
Ajay Ramachandran
4ca57cc025 Fixed preview sponsors not skipping when only they are there. 2020-02-19 13:45:00 -05:00
Ajay Ramachandran
397bcc94c5 Remove redundant code 2020-02-19 13:35:05 -05:00
Ajay Ramachandran
8b28bccfd7 Run dev now uses dev build. 2020-02-19 12:57:22 -05:00
Ajay Ramachandran
c6107057d9 Firefox dev environment now loads Firefox uBlock Origin 2020-02-19 12:54:58 -05:00
Ajay Ramachandran
ab2a9530e9 Sped up zero second sponsors a tiny bit 2020-02-19 12:41:22 -05:00
Ajay Ramachandran
bfc771bd99 Removed unused variables 2020-02-19 12:37:39 -05:00
Ajay Ramachandran
e75e588755 Sped up direct links a tiny bit. 2020-02-19 12:37:17 -05:00
Ajay Ramachandran
0266bb49ca Fixed typo 2020-02-19 12:35:10 -05:00
Ajay Ramachandran
9e693fd555 Update README.md 2020-02-19 12:33:48 -05:00
16 changed files with 504 additions and 59 deletions

View File

@@ -23,6 +23,10 @@ jobs:
with: with:
name: ChromeExtension name: ChromeExtension
path: dist path: dist
- run: mkdir ./builds
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/ChromeExtension.zip ./dist
# Create Firefox artifacts # Create Firefox artifacts
- name: Create Firefox artifacts - name: Create Firefox artifacts
@@ -31,4 +35,28 @@ jobs:
with: with:
name: FirefoxExtension name: FirefoxExtension
path: dist path: dist
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/FirefoxExtension.zip ./dist
# Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env.stream=beta
- uses: actions/upload-artifact@v1
with:
name: ChromeExtensionBeta
path: dist
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/ChromeExtensionBeta.zip ./dist
- name: Create Firefox Beta artifacts
run: npm run build:firefox -- --env.stream=beta
- uses: actions/upload-artifact@v1
with:
name: FirefoxExtensionBeta
path: dist
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/FirefoxExtensionBeta.zip ./dist

76
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,76 @@
name: Upload Release Build
on: release
jobs:
build:
name: Upload Release
runs-on: ubuntu-latest
steps:
# Initialization
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
- run: npm install
- name: Copy configuration
run: cp config.json.example config.json
# Create Chrome artifacts
- name: Create Chrome artifacts
run: npm run build:chrome
- uses: actions/upload-artifact@v1
with:
name: ChromeExtension
path: dist
- run: mkdir ./builds
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/ChromeExtension.zip ./dist
# Create Firefox artifacts
- name: Create Firefox artifacts
run: npm run build:firefox
- uses: actions/upload-artifact@v1
with:
name: FirefoxExtension
path: dist
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/FirefoxExtension.zip ./dist
# Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env.stream=beta
- uses: actions/upload-artifact@v1
with:
name: ChromeExtensionBeta
path: dist
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/ChromeExtensionBeta.zip ./dist
- name: Create Firefox Beta artifacts
run: npm run build:firefox -- --env.stream=beta
- uses: actions/upload-artifact@v1
with:
name: FirefoxExtensionBeta
path: dist
- uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./builds/FirefoxExtensionBeta.zip ./dist
# Upload each release asset
- name: Upload to release
uses: Shopify/upload-to-release@master
with:
args: builds/ChromeExtension.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload to release
uses: Shopify/upload-to-release@master
with:
args: builds/FirefoxExtension.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -68,9 +68,9 @@ The result is in `dist`.
# Credit # Credit
The awesome [Invidious API](https://github.com/omarroth/invidious/wiki/API) used to be used. The awesome [Invidious API](https://github.com/omarroth/invidious/wiki/API) previously was used.
Original code from [YTSponsorSkip](https://github.com/OfficialNoob/YTSponsorSkip), but not much of the code is left. Originally forked from [YTSponsorSkip](https://github.com/OfficialNoob/YTSponsorSkip), but zero code remains.
Some icons made by <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a> Some icons made by <a href="https://www.flaticon.com/authors/gregor-cresnar" title="Gregor Cresnar">Gregor Cresnar</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and are licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a>

View File

@@ -0,0 +1,4 @@
{
"name": "BETA - SponsorBlock"
}

View File

@@ -0,0 +1,8 @@
{
"browser_specific_settings": {
"gecko": {
"id": "sponsorBlockerBETA@ajay.app"
}
}
}

View File

@@ -1,7 +1,7 @@
{ {
"name": "__MSG_fullName__", "name": "__MSG_fullName__",
"short_name": "__MSG_Name__", "short_name": "__MSG_Name__",
"version": "1.2.14", "version": "1.2.20",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_Description__", "description": "__MSG_Description__",
"content_scripts": [{ "content_scripts": [{

View File

@@ -24,16 +24,19 @@
}, },
"scripts": { "scripts": {
"web-run": "npm run web-run:chrome", "web-run": "npm run web-run:chrome",
"web-run:firefox": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm", "web-run:firefox": "cd dist && web-ext run --start-url https://addons.mozilla.org/firefox/addon/ublock-origin/",
"web-run:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium", "web-run:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium",
"build": "npm run build:chrome", "build": "npm run build:chrome",
"build:chrome": "webpack --env.browser=chrome --config webpack/webpack.prod.js", "build:chrome": "webpack --env.browser=chrome --config webpack/webpack.prod.js",
"build:firefox": "webpack --env.browser=firefox --config webpack/webpack.prod.js", "build:firefox": "webpack --env.browser=firefox --config webpack/webpack.prod.js",
"build:dev": "npm run build:dev:chrome",
"build:dev:chrome": "webpack --env.browser=chrome --config webpack/webpack.dev.js",
"build:dev:firefox": "webpack --env.browser=firefox --config webpack/webpack.dev.js",
"build:watch": "npm run build:watch:chrome", "build:watch": "npm run build:watch:chrome",
"build:watch:chrome": "webpack --env.browser=chrome --config webpack/webpack.dev.js --watch", "build:watch:chrome": "webpack --env.browser=chrome --config webpack/webpack.dev.js --watch",
"build:watch:firefox": "webpack --env.browser=firefox --config webpack/webpack.dev.js --watch", "build:watch:firefox": "webpack --env.browser=firefox --config webpack/webpack.dev.js --watch",
"dev": "npm run build && concurrently \"npm run web-run\" \"npm run build:watch\"", "dev": "npm run build:dev && concurrently \"npm run web-run\" \"npm run build:watch\"",
"dev:firefox": "npm run build:firefox && concurrently \"npm run web-run:firefox\" \"npm run build:watch:firefox\"", "dev:firefox": "npm run build:dev:firefox && concurrently \"npm run web-run:firefox\" \"npm run build:watch:firefox\"",
"clean": "rimraf dist", "clean": "rimraf dist",
"test": "npx jest" "test": "npx jest"
}, },

View File

@@ -160,7 +160,7 @@
"message": "Click the button below when the sponsorship starts and ends to record and\nsubmit it to the database." "message": "Click the button below when the sponsorship starts and ends to record and\nsubmit it to the database."
}, },
"popupHint": { "popupHint": {
"message": "Hint: Press the semicolon key while focused on a video report the start/end of a sponsor and quote to submit. (This can be changed in the options)" "message": "Hint: Press the semicolon key while focused on a video to report the start/end of a sponsor and quote to submit. (This can be changed in the options)"
}, },
"lastTimes": { "lastTimes": {
"message": "Latest Sponsor Message Times Chosen" "message": "Latest Sponsor Message Times Chosen"
@@ -226,7 +226,7 @@
"message": "Show Notice Again" "message": "Show Notice Again"
}, },
"longDescription": { "longDescription": {
"message": "SponsorBlock is an extension that will skip over sponsored segments of YouTube videos. SponsorBlock is a crowdsourced browser extension that let's anyone submit the start and end time's of sponsored segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment.", "message": "SponsorBlock is an extension that will skip over sponsored segments of YouTube videos. SponsorBlock is a crowdsourced browser extension that lets anyone submit the start and end times of sponsored segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment.",
"description": "Full description of the extension on the store pages." "description": "Full description of the extension on the store pages."
}, },
"website": { "website": {
@@ -381,17 +381,11 @@
"whatAutoUpvote": { "whatAutoUpvote": {
"message": "With this enabled, the extension will upvote all submissions you view if you do not report them. If the notice is disabled, this will not occur." "message": "With this enabled, the extension will upvote all submissions you view if you do not report them. If the notice is disabled, this will not occur."
}, },
"invidiousInfo1": {
"message": "Invidious (the 3rd party YouTube site) support has been added!"
},
"invidiousInfo2": {
"message": "You MUST enable it in the options for it to work."
},
"minDuration": { "minDuration": {
"message": "Minimum duration (seconds):" "message": "Minimum duration (seconds):"
}, },
"minDurationDescription": { "minDurationDescription": {
"message": "Sponsor segments shorter than the set value will not be skipeed or show in the player." "message": "Sponsor segments shorter than the set value will not be skipped or show in the player."
}, },
"shortCheck": { "shortCheck": {
"message": "The following submission is shorter than your minimum duration option. This could mean that this is already submitted, and just being ignored due to this option. Are you sure you would like to submit?" "message": "The following submission is shorter than your minimum duration option. This could mean that this is already submitted, and just being ignored due to this option. Are you sure you would like to submit?"
@@ -428,5 +422,8 @@
}, },
"whatUnlistedCheck": { "whatUnlistedCheck": {
"message": "This setting will significantly slow down SponsorBlock. Sponsor lookups require sending the video ID to the server. If you are concerned about unlisted video IDs being sent over the internet, enable this option." "message": "This setting will significantly slow down SponsorBlock. Sponsor lookups require sending the video ID to the server. If you are concerned about unlisted video IDs being sent over the internet, enable this option."
},
"mobileUpdateInfo": {
"message": "m.youtube.com is now supported"
} }
} }

View File

@@ -28,10 +28,10 @@
"message": "Канал добавлен в белый список!" "message": "Канал добавлен в белый список!"
}, },
"Sponsor": { "Sponsor": {
"message": "Спонсор" "message": "спонсора"
}, },
"Sponsors": { "Sponsors": {
"message": "Спонсоры" "message": "спонсоров"
}, },
"Segment": { "Segment": {
"message": "спонсорская вставка" "message": "спонсорская вставка"
@@ -123,5 +123,299 @@
}, },
"submitCheck": { "submitCheck": {
"message": "Вы уверены, что хотите отправить эту информацию?" "message": "Вы уверены, что хотите отправить эту информацию?"
},
"whitelistChannel": {
"message": "Добавить канал в белый список"
},
"removeFromWhitelist": {
"message": "Удалить канал из белого списка"
},
"voteOnTime": {
"message": "Проголосовать за время спонсорской вставки"
},
"recordTimes": {
"message": "Записать время спонсорской вставки"
},
"soFarUHSubmited": {
"message": "На данный момент Вы отправили"
},
"savedPeopleFrom": {
"message": "Вы помогли людям сэкономить "
},
"viewLeaderboard": {
"message": "Посмотреть доску почёта"
},
"here": {
"message": "здесь"
},
"recordTimesDescription": {
"message": "Нажмите кнопку ниже, когда спонсорская вставка начинается и заканчивается, чтобы записать\nи отправить её в базу данных."
},
"popupHint": {
"message": "Подсказка: нажмите ;, чтобы сообщить начало/конец спонсорской вставки, и \", чтобы отправить. (Это можно изменить в настройках)"
},
"lastTimes": {
"message": "Последнее выбранное время спонсорской вставки"
},
"clearTimesButton": {
"message": "Очистить время"
},
"submitTimesButton": {
"message": "Отправить время"
},
"publicStats": {
"message": "Оно используется на публичной странице статистики, чтобы показать Ваш вклад. Её можно посмотреть "
},
"setUsername": {
"message": "Установить имя пользователя"
},
"discordAdvert": {
"message": "Присоединяйтесь к официальному серверу Discord, чтобы оставить предложения и обратную связь!"
},
"hideThis": {
"message": "Скрыть это"
},
"Options": {
"message": "Настройки"
},
"showButtons": {
"message": "Показывать кнопки в плеере YouTube"
},
"hideButtons": {
"message": "Скрыть кнопки в плеере YouTube"
},
"hideButtonsDescription": {
"message": "Эта настройка скрывает кнопки для отправки спонсорских вставок, которые появляются в плеере YouTube. Они могут раздражать\n некоторых. Вместо кнопок для отправки спонсорских вставок можно использовать это всплывающее окно. Чтобы скрыть\nуведомление, нажмите кнопку \"Не показывать снова\" в уведомлении. Вы всегда сможете включить эти настройки обратно."
},
"showInfoButton": {
"message": "Показывать кнопку информации в плеере YouTube"
},
"hideInfoButton": {
"message": "Скрыть кнопку информации в плеере YouTube"
},
"whatInfoButton": {
"message": "Эта кнопка открывает всплывающее окно на странице YouTube."
},
"hideDeleteButton": {
"message": "Скрыть кнопку удаления в плеере YouTube"
},
"showDeleteButton": {
"message": "Показывать кнопку удаления в плеере YouTube"
},
"whatDeleteButton": {
"message": "Эта кнопка позволяет Вам очистить все спонсорские вставки в плеере YouTube."
},
"disableViewTracking": {
"message": "Отключить отслеживание количества пропусков спонсорских вставок"
},
"enableViewTracking": {
"message": "Включить отслеживание количества пропусков спонсорских вставок"
},
"whatViewTracking": {
"message": "Эта возможность отслеживает, какие спонсорские вставки Вы пропустили, чтобы помочь пользователям узнать, насколько их\nвклад помог другим, и используется как метрика, чтобы убедиться, что спам не попадает в базу данных. Расширение отправляет\nсообщение на сервер каждый раз, когда Вы пропускаете спонсорскую вставку. Надеемся, большая часть пользователей не поменяет эту настройку, так что у нас будет точная статистика просмотров :)"
},
"showNotice": {
"message": "Показывать уведомление снова"
},
"longDescription": {
"message": "SponsorBlock — это расширение, которое пропускает спонсорские вставки в видео на YouTube. SponsorBlock — это краудсорсинговое расширение, которое позволяет каждому отправить время начала и конца спонсорских сегментов в видео на YouTube. После того, как кто-нибудь отправляет эту информацию, все остальные пользователи расширения будут автоматически пропускать спонсорские сегменты.",
"description": "Полное описание расширения на страницах магазинов."
},
"website": {
"message": "Сайт",
"description": "Используется на странице магазина Firefox"
},
"sourceCode": {
"message": "Исходный код",
"description": "Используется на странице магазина Firefox"
},
"noticeUpdate": {
"message": "Уведомление было обновлено!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "Если оно Вам всё равно не нравится, нажмите \"не показывать\".",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setStartSponsorShortcut": {
"message": "Назначить горячую клавишу для начала спонсорской вставки"
},
"setSubmitKeybind": {
"message": "Назначить горячую клавишу для отправки"
},
"keybindDescription": {
"message": "Нажмите клавишу, чтобы выбрать её"
},
"keybindDescriptionComplete": {
"message": "Клавиша назначена на: "
},
"0": {
"message": "Таймаут подключения. Проверьте ваше соединение с интернетом. Если ваш интернет работает, сервер, скорее всего, перегружен или лежит."
},
"disableSkipping": {
"message": "Отключить SponsorBlock"
},
"enableSkipping": {
"message": "Включить SponsorBlock"
},
"yourWork": {
"message": "Ваша работа",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "Похоже, сервер перегружен. Попробуйте ещё раз через несколько секунд."
},
"errorCode": {
"message": "Код ошибки: "
},
"noticeTitleNotSkipped": {
"message": "Пропустить спонсорскую вставку?"
},
"skip": {
"message": "Пропустить"
},
"disableAutoSkip": {
"message": "Отключить автоматический пропуск"
},
"enableAutoSkip": {
"message": "Включить автоматический пропуск"
},
"autoSkipDescription": {
"message": "Автоматический пропуск будет пропускать спонсорские вставки за Вас. Если выключено, будет показываться уведомление с предложением пропустить."
},
"youHaveSkipped": {
"message": "Вы пропустили "
},
"youHaveSaved": {
"message": "Вы сэкономили "
},
"minLower": {
"message": "минуту"
},
"minsLower": {
"message": "минут"
},
"hourLower": {
"message": "час"
},
"hoursLower": {
"message": "часов"
},
"youHaveSavedTime": {
"message": "Вы сэкономили людям"
},
"youHaveSavedTimeEnd": {
"message": " их жизней."
},
"guildlinesSummary": {
"message": "- Убедитесь, что Ваш сегмент содержит только платную интеграцию, и больше ничего.\n- Убедитесь, что пропуск этого сегмента не пропустит никакой ценный контент\n- Если всё видео целиком спонсорское, пожалуйста, не сообщайте о нём. Система для сообщения о целых видео скоро выйдет.\n- Пожалуйста, не сообщайте об отказах от ответственности, которые могут показать предвзятость (если видео с обзором проплачено, не пропускайте, когда они это упоминают)."
},
"statusReminder": {
"message": "Смотрите состояние сервера на status.sponsor.ajay.app."
},
"changeUserID": {
"message": "Импортировать/экспортировать Ваш идентификатор пользователя"
},
"whatChangeUserID": {
"message": "Это нужно держать в секрете. Это как пароль, не стоит им ни с кем делиться. Если он у кого-то есть, он сможет выдать себя за Вас."
},
"setUserID": {
"message": "Установить идентификатор пользователя"
},
"userIDChangeWarning": {
"message": "Внимание: изменение идентификатора пользователя необратимо. Вы действительно хотите это сделать? Сделайте резервную копию вашего старого на всякий случай."
},
"createdBy": {
"message": "Создано"
},
"autoSkip": {
"message": "Автоматический пропуск"
},
"showSkipNotice": {
"message": "Показывать уведомление после пропуска спонсорской вставки"
},
"keybindCurrentlySet": {
"message": ". Он сейчас назначен на:"
},
"supportInvidious": {
"message": "Поддержка Invidious"
},
"supportInvidiousDescription": {
"message": "Invidious (invidio.us) — это неофициальный клиент YouTube. Чтобы включить поддержку, Вам понадобится принять дополнительные разрешения. Это НЕ работает в приватном режиме в Chrome и других вариантах Chromium."
},
"optionsInfo": {
"message": "Включить поддержку Invidious, выключить автоматический пропуск, скрыть кнопки и не только."
},
"addInvidiousInstance": {
"message": "Добавить инстанс Invidious"
},
"addInvidiousInstanceDescription": {
"message": "Добавить свой инстанс Invidious. Формат: ТОЛЬКО домен. Например, invidious.ajay.app"
},
"add": {
"message": "Добавить"
},
"addInvidiousInstanceError": {
"message": "Это неправильный домен. Введите ТОЛЬКО домен. Например, invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "Сбросить список инстансов Invidious"
},
"resetInvidiousInstanceAlert": {
"message": "Вы собираетесь сбросить список инстансов Invidious"
},
"currentInstances": {
"message": "Текущие инстансы:"
},
"enableAutoUpvote": {
"message": "Автоматически голосовать \"за\""
},
"whatAutoUpvote": {
"message": "Если это включено, расширение будет голосовать \"за\" все предложения других пользователей, если Вы на них не пожалуетесь. Если уведомление отключено, это не будет происходить."
},
"minDuration": {
"message": "Минимальная длительность (секунд):"
},
"minDurationDescription": {
"message": "Спонсорские сегменты короче этого значения не будут пропускаться и не будут показаны в плеере."
},
"shortCheck": {
"message": "Следующий диапазон времени короче, чем Ваша настройка минимальной длительности. Это может означать, что он уже был отправлен, и просто игнорируется из-за этой настройки. Вы действительно хотите отправить?"
},
"showUploadButton": {
"message": "Показывать кнопку отправки"
},
"whatUploadButton": {
"message": "Эта кнопка появляется в плеере YouTube после того, как Вы выбрали отметку времени и готовы к отправке."
},
"customServerAddress": {
"message": "Адрес сервера SponsorBlock"
},
"customServerAddressDescription": {
"message": "Адрес, по которому SponsorBlock обращается к серверу.\nМеняйте только если Вы подняли свой сервер."
},
"save": {
"message": "Сохранить"
},
"reset": {
"message": "Сбросить"
},
"customAddressError": {
"message": "Этот адрес неправильного формата. Убедитесь, что он начинается с http:// или https://, и что на конце нет слэшей."
},
"areYouSureReset": {
"message": "Вы действительно хотите это сбросить?"
},
"confirmPrivacy": {
"message": "Было обнаружено, что это видео непубличное. Нажмите \"отмена\", если не хотите проверять его на спонсоров."
},
"unlistedCheck": {
"message": "Игнорировать непубличные видео"
},
"whatUnlistedCheck": {
"message": "Эта настройка значительно замедлит SponsorBlock. Поиск спонсоров требует отправки идентификатора видео на сервер. Если Вас беспокоит отправка идентификаторов непубличных видео по интернету, включите эту настройку."
},
"mobileUpdateInfo": {
"message": "m.youtube.com теперь поддерживается"
} }
} }

View File

@@ -86,9 +86,9 @@ chrome.runtime.onInstalled.addListener(function (object) {
//save this UUID //save this UUID
Config.config.userID = newUserID; Config.config.userID = newUserID;
//TODO: Remove when invidious support is old //TODO: Remove when mobile support is old
// Don't show this to new users // Don't show this to new users
Config.config.invidiousUpdateInfoShowCount = 6; // Config.config.mobileUpdateShowCount = 1;
} }
}, 1500); }, 1500);
}); });

View File

@@ -20,12 +20,12 @@ interface SBConfig {
hideDiscordLaunches: number, hideDiscordLaunches: number,
hideDiscordLink: boolean, hideDiscordLink: boolean,
invidiousInstances: string[], invidiousInstances: string[],
invidiousUpdateInfoShowCount: number,
autoUpvote: boolean, autoUpvote: boolean,
supportInvidious: boolean, supportInvidious: boolean,
serverAddress: string, serverAddress: string,
minDuration: number, minDuration: number,
checkForUnlistedVideos: boolean checkForUnlistedVideos: boolean,
mobileUpdateShowCount: number
} }
interface SBObject { interface SBObject {
@@ -116,12 +116,12 @@ var Config: SBObject = {
hideDiscordLaunches: 0, hideDiscordLaunches: 0,
hideDiscordLink: false, hideDiscordLink: false,
invidiousInstances: ["invidio.us", "invidiou.sh", "invidious.snopyta.org"], invidiousInstances: ["invidio.us", "invidiou.sh", "invidious.snopyta.org"],
invidiousUpdateInfoShowCount: 0,
autoUpvote: true, autoUpvote: true,
supportInvidious: false, supportInvidious: false,
serverAddress: CompileConfig.serverAddress, serverAddress: CompileConfig.serverAddress,
minDuration: 0, minDuration: 0,
checkForUnlistedVideos: false checkForUnlistedVideos: false,
mobileUpdateShowCount: 0
}, },
localConfig: null, localConfig: null,
config: null config: null

View File

@@ -43,8 +43,9 @@ var lastPreviewBarUpdate;
//whether the duration listener listening for the duration changes of the video has been setup yet //whether the duration listener listening for the duration changes of the video has been setup yet
var durationListenerSetUp = false; var durationListenerSetUp = false;
// Timestamp of the last duration change
var lastDurationChange = 0; // Is the video currently being switched
var switchingVideos = false;
//the channel this video is about //the channel this video is about
var channelURL; var channelURL;
@@ -66,10 +67,7 @@ var previewResetter: NodeJS.Timeout = null;
var controls = null; var controls = null;
// Direct Links after the config is loaded // Direct Links after the config is loaded
utils.wait(() => Config.config !== null).then(() => videoIDChange(getYouTubeVideoID(document.URL))); utils.wait(() => Config.config !== null, 1000, 1).then(() => videoIDChange(getYouTubeVideoID(document.URL)));
//the last time looked at (used to see if this time is in the interval)
var lastTime = -1;
//the amount of times the sponsor lookup has retried //the amount of times the sponsor lookup has retried
//this only happens if there is an error //this only happens if there is an error
@@ -240,9 +238,6 @@ document.onkeydown = function(e: KeyboardEvent){
} }
function resetValues() { function resetValues() {
//reset last sponsor times
lastTime = -1;
//reset sponsor times //reset sponsor times
sponsorTimes = null; sponsorTimes = null;
UUIDs = []; UUIDs = [];
@@ -269,6 +264,8 @@ async function videoIDChange(id) {
//id is not valid //id is not valid
if (!id) return; if (!id) return;
switchingVideos = true;
// Wait for options to be ready // Wait for options to be ready
await utils.wait(() => Config.config !== null, 5000, 1); await utils.wait(() => Config.config !== null, 5000, 1);
@@ -430,14 +427,14 @@ function createPreviewBar(): void {
* This happens when the resolution changes or at random time to clear memory. * This happens when the resolution changes or at random time to clear memory.
*/ */
function durationChangeListener() { function durationChangeListener() {
lastDurationChange = Date.now();
updatePreviewBar(); updatePreviewBar();
} }
function cancelSponsorSchedule(): void { function cancelSponsorSchedule(): void {
if (currentSkipSchedule !== null) { if (currentSkipSchedule !== null) {
clearTimeout(currentSkipSchedule); clearTimeout(currentSkipSchedule);
currentSkipSchedule = null;
} }
} }
@@ -448,7 +445,7 @@ function cancelSponsorSchedule(): void {
function startSponsorSchedule(currentTime?: number): void { function startSponsorSchedule(currentTime?: number): void {
cancelSponsorSchedule(); cancelSponsorSchedule();
if (sponsorTimes === null || Config.config.disableSkipping || channelWhitelisted){ if (Config.config.disableSkipping || channelWhitelisted){
return; return;
} }
@@ -456,18 +453,24 @@ function startSponsorSchedule(currentTime?: number): void {
let skipInfo = getNextSkipIndex(currentTime); let skipInfo = getNextSkipIndex(currentTime);
if (skipInfo.index === -1) return;
let skipTime = skipInfo.array[skipInfo.index]; let skipTime = skipInfo.array[skipInfo.index];
let timeUntilSponsor = skipTime[0] - currentTime; let timeUntilSponsor = skipTime[0] - currentTime;
currentSkipSchedule = setTimeout(() => { let skippingFunction = () => {
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) { if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
skipToTime(video, skipInfo.index, skipInfo.array, skipInfo.openNotice); skipToTime(video, skipInfo.index, skipInfo.array, skipInfo.openNotice);
startSponsorSchedule();
} else {
startSponsorSchedule();
} }
}, timeUntilSponsor * 1000 * (1 / video.playbackRate));
startSponsorSchedule(skipTime[0] + 0.001);
};
if (timeUntilSponsor <= 0) {
skippingFunction();
} else {
currentSkipSchedule = setTimeout(skippingFunction, timeUntilSponsor * 1000 * (1 / video.playbackRate));
}
} }
function sponsorsLookup(id: string, channelIDPromise?) { function sponsorsLookup(id: string, channelIDPromise?) {
@@ -488,11 +491,18 @@ function sponsorsLookup(id: string, channelIDPromise?) {
if (!seekListenerSetUp && !Config.config.disableSkipping) { if (!seekListenerSetUp && !Config.config.disableSkipping) {
seekListenerSetUp = true; seekListenerSetUp = true;
video.addEventListener('seeked', () => startSponsorSchedule()); video.addEventListener('play', () => {
video.addEventListener('play', () => startSponsorSchedule()); switchingVideos = false;
startSponsorSchedule();
});
video.addEventListener('seeked', () => {
if (!video.paused) startSponsorSchedule();
});
video.addEventListener('ratechange', () => startSponsorSchedule()); video.addEventListener('ratechange', () => startSponsorSchedule());
video.addEventListener('seeking', cancelSponsorSchedule); video.addEventListener('seeking', cancelSponsorSchedule);
video.addEventListener('pause', cancelSponsorSchedule); video.addEventListener('pause', cancelSponsorSchedule);
startSponsorSchedule();
} }
if (channelIDPromise !== undefined) { if (channelIDPromise !== undefined) {
@@ -562,10 +572,12 @@ function sponsorsLookup(id: string, channelIDPromise?) {
} }
} }
if (zeroSecondSponsor) { if (!video.paused && !switchingVideos) {
startSponsorSchedule(0); if (zeroSecondSponsor) {
} else { startSponsorSchedule(0);
startSponsorSchedule(); } else {
startSponsorSchedule();
}
} }
// Reset skip save // Reset skip save
@@ -767,7 +779,8 @@ function getNextSkipIndex(currentTime: number): {array: number[][], index: numbe
let minPreviewSponsorTimeIndex = previewSponsorStartTimes.indexOf(Math.min(...previewSponsorStartTimesAfterCurrentTime)); let minPreviewSponsorTimeIndex = previewSponsorStartTimes.indexOf(Math.min(...previewSponsorStartTimesAfterCurrentTime));
if (minPreviewSponsorTimeIndex == -1 || sponsorStartTimes[minSponsorTimeIndex] < previewSponsorStartTimes[minPreviewSponsorTimeIndex]) { if ((minPreviewSponsorTimeIndex === -1 && minSponsorTimeIndex !== -1) ||
sponsorStartTimes[minSponsorTimeIndex] < previewSponsorStartTimes[minPreviewSponsorTimeIndex]) {
return { return {
array: sponsorTimes, array: sponsorTimes,
index: minSponsorTimeIndex, index: minSponsorTimeIndex,
@@ -791,6 +804,8 @@ function getNextSkipIndex(currentTime: number): {array: number[][], index: numbe
* @param hideHiddenSponsors * @param hideHiddenSponsors
*/ */
function getStartTimes(sponsorTimes: number[][], minimum?: number, hideHiddenSponsors: boolean = false): number[] { function getStartTimes(sponsorTimes: number[][], minimum?: number, hideHiddenSponsors: boolean = false): number[] {
if (sponsorTimes === null) return [];
let startTimes: number[] = []; let startTimes: number[] = [];
for (let i = 0; i < sponsorTimes.length; i++) { for (let i = 0; i < sponsorTimes.length; i++) {
@@ -802,7 +817,7 @@ function getStartTimes(sponsorTimes: number[][], minimum?: number, hideHiddenSpo
return startTimes; return startTimes;
} }
//skip from fhe start time to the end time for a certain index sponsor time //skip from the start time to the end time for a certain index sponsor time
function skipToTime(v, index, sponsorTimes, openNotice) { function skipToTime(v, index, sponsorTimes, openNotice) {
if (!Config.config.disableAutoSkip || previewResetter !== null) { if (!Config.config.disableAutoSkip || previewResetter !== null) {
v.currentTime = sponsorTimes[index][1]; v.currentTime = sponsorTimes[index][1];
@@ -816,8 +831,16 @@ function skipToTime(v, index, sponsorTimes, openNotice) {
if (openNotice) { if (openNotice) {
//send out the message saying that a sponsor message was skipped //send out the message saying that a sponsor message was skipped
if (!Config.config.dontShowNotice) { if (!Config.config.dontShowNotice) {
let skipNotice = new SkipNotice(this, currentUUID, Config.config.disableAutoSkip, skipNoticeContentContainer); let skipNotice = new SkipNotice(this, currentUUID, Config.config.disableAutoSkip, skipNoticeContentContainer);
//TODO: Remove this when Mobile support is old
if (Config.config.mobileUpdateShowCount < 1) {
skipNotice.addNoticeInfoMessage(chrome.i18n.getMessage("mobileUpdateInfo"));
Config.config.mobileUpdateShowCount += 1;
}
//auto-upvote this sponsor //auto-upvote this sponsor
if (Config.config.trackViewCount && !Config.config.disableAutoSkip && Config.config.autoUpvote) { if (Config.config.trackViewCount && !Config.config.disableAutoSkip && Config.config.autoUpvote) {
vote(1, currentUUID, null); vote(1, currentUUID, null);
@@ -825,16 +848,14 @@ function skipToTime(v, index, sponsorTimes, openNotice) {
} }
//send telemetry that a this sponsor was skipped //send telemetry that a this sponsor was skipped
if (Config.config.trackViewCount && !sponsorSkipped[index]) { if (Config.config.trackViewCount && !sponsorSkipped[index] && !Config.config.disableAutoSkip) {
utils.sendRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + currentUUID); utils.sendRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + currentUUID);
if (!Config.config.disableAutoSkip) { // Count this as a skip
// Count this as a skip Config.config.minutesSaved = Config.config.minutesSaved + (sponsorTimes[index][1] - sponsorTimes[index][0]) / 60;
Config.config.minutesSaved = Config.config.minutesSaved + (sponsorTimes[index][1] - sponsorTimes[index][0]) / 60; Config.config.skipCount = Config.config.skipCount + 1;
Config.config.skipCount = Config.config.skipCount + 1;
sponsorSkipped[index] = true; sponsorSkipped[index] = true;
}
} }
} }
} }

View File

@@ -58,7 +58,7 @@ class SkipNotice {
noticeElement.style.zIndex = String(50 + amountOfPreviousNotices); noticeElement.style.zIndex = String(50 + amountOfPreviousNotices);
if (contentContainer().onMobileYouTube) { if (contentContainer().onMobileYouTube) {
noticeElement.style.bottom = "4em"; noticeElement.style.bottom = "4em";
noticeElement.style.zoom = "0.8"; noticeElement.style.transform = "scale(0.8) translate(10%, 10%)";
} }
//add mouse enter and leave listeners //add mouse enter and leave listeners

View File

@@ -157,7 +157,7 @@ async function runThePopup(messageListener?: MessageListener) {
//get the amount of times this user has contributed and display it to thank them //get the amount of times this user has contributed and display it to thank them
if (Config.config.sponsorTimesContributed != undefined) { if (Config.config.sponsorTimesContributed != undefined) {
if (Config.config.sponsorTimesContributed > 1) { if (Config.config.sponsorTimesContributed !== 1) {
PageElements.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Sponsors"); PageElements.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Sponsors");
} else { } else {
PageElements.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Sponsor"); PageElements.sponsorTimesContributionsDisplayEndWord.innerText = chrome.i18n.getMessage("Sponsor");

View File

@@ -42,7 +42,8 @@ module.exports = env => ({
), ),
new BuildManifest({ new BuildManifest({
browser: env.browser, browser: env.browser,
pretty: env.mode === "production" pretty: env.mode === "production",
stream: env.stream
}) })
] ]
}); });

View File

@@ -8,6 +8,8 @@ const fs = require('fs');
const manifest = require("../manifest/manifest.json"); const manifest = require("../manifest/manifest.json");
const firefoxManifestExtra = require("../manifest/firefox-manifest-extra.json"); const firefoxManifestExtra = require("../manifest/firefox-manifest-extra.json");
const chromeManifestExtra = require("../manifest/chrome-manifest-extra.json"); const chromeManifestExtra = require("../manifest/chrome-manifest-extra.json");
const betaManifestExtra = require("../manifest/beta-manifest-extra.json");
const firefoxBetaManifestExtra = require("../manifest/firefox-beta-manifest-extra.json");
// schema for options object // schema for options object
const schema = { const schema = {
@@ -18,6 +20,9 @@ const schema = {
}, },
pretty: { pretty: {
type: 'boolean' type: 'boolean'
},
steam: {
type: 'string'
} }
} }
}; };
@@ -40,6 +45,14 @@ class BuildManifest {
mergeObjects(manifest, chromeManifestExtra); mergeObjects(manifest, chromeManifestExtra);
} }
if (this.options.stream === "beta") {
mergeObjects(manifest, betaManifestExtra);
if (this.options.browser.toLowerCase() === "firefox") {
mergeObjects(manifest, firefoxBetaManifestExtra);
}
}
let result = JSON.stringify(manifest); let result = JSON.stringify(manifest);
if (this.options.pretty) result = JSON.stringify(manifest, null, 2); if (this.options.pretty) result = JSON.stringify(manifest, null, 2);