mirror of
https://github.com/Anarios/return-youtube-dislike.git
synced 2026-09-12 10:22:10 +02:00
Prettier applied to whole project, prettier added to pre-commit hook
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"presets": ["@babel/preset-env"]
|
"presets": ["@babel/preset-env"],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx lint-staged
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
Read this in other languages: [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
Read this in other languages: [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Welcome To Return YouTube Dislikes contributing guide
|
# Welcome To Return YouTube Dislikes contributing guide
|
||||||
|
|
||||||
Thank you for investing your time in contributing to our project! All your changes will be reflected in the next version of the extension (or the [website](https://www.returnyoutubedislike.com/)).
|
Thank you for investing your time in contributing to our project! All your changes will be reflected in the next version of the extension (or the [website](https://www.returnyoutubedislike.com/)).
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
|
|
||||||
Lisez ceci dans d'autres langues : [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), Nederlands](CONTRIBUTINGnl.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
Lisez ceci dans d'autres langues : [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), Nederlands](CONTRIBUTINGnl.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Bienvenue dans le guide de contribution à Return YouTube Dislikes
|
# Bienvenue dans le guide de contribution à Return YouTube Dislikes
|
||||||
|
|
||||||
Merci d'investir votre temps pour contribuer à notre projet ! Toutes vos modifications seront prises en compte dans la prochaine version de l'extension (ou du site web).
|
Merci d'investir votre temps pour contribuer à notre projet ! Toutes vos modifications seront prises en compte dans la prochaine version de l'extension (ou du site web).
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
Read this in other languages: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md)
|
Read this in other languages: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md)
|
||||||
|
|
||||||
|
|
||||||
# Witamy w przewodniku współtworzenia Return YouTube Dislike
|
# Witamy w przewodniku współtworzenia Return YouTube Dislike
|
||||||
|
|
||||||
Dziękujemy za zainwestowanie czasu w rozwój naszego projektu! Wszystkie Twoje zmiany znajdą się w następnej wersji rozszerzenia ([bądź strony](https://www.returnyoutubedislike.com/)).
|
Dziękujemy za zainwestowanie czasu w rozwój naszego projektu! Wszystkie Twoje zmiany znajdą się w następnej wersji rozszerzenia ([bądź strony](https://www.returnyoutubedislike.com/)).
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
Прочитать на других языках: [English](CONTRIBUTING.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
Прочитать на других языках: [English](CONTRIBUTING.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Добро пожаловать в руководство по внесению вклада Return YouTube Dislikes
|
# Добро пожаловать в руководство по внесению вклада Return YouTube Dislikes
|
||||||
|
|
||||||
Благодарим вас за то, что вы потратили своё время на участие в нашем проекте! Все ваши изменения будут отражены в следующей версии расширения (или на [сайте](https://www.returnyoutubedislike.com/)).
|
Благодарим вас за то, что вы потратили своё время на участие в нашем проекте! Все ваши изменения будут отражены в следующей версии расширения (или на [сайте](https://www.returnyoutubedislike.com/)).
|
||||||
|
|||||||
+67
-67
@@ -1,67 +1,67 @@
|
|||||||
Read this in other languages: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [Polski](CONTRIBUTINGpl.md)
|
Read this in other languages: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [Polski](CONTRIBUTINGpl.md)
|
||||||
|
|
||||||
# Вітаємо у посібнику внеску в Return YouTube Dislikes
|
# Вітаємо у посібнику внеску в Return YouTube Dislikes
|
||||||
|
|
||||||
Дякуємо, що вкладаєте свій час у розвиток нашого проєкту! Усі ваші зміни буде відображено в наступній версії розширення (або ж [вебсайту](https://www.returnyoutubedislike.com/)).
|
Дякуємо, що вкладаєте свій час у розвиток нашого проєкту! Усі ваші зміни буде відображено в наступній версії розширення (або ж [вебсайту](https://www.returnyoutubedislike.com/)).
|
||||||
|
|
||||||
## Почнімо працювати
|
## Почнімо працювати
|
||||||
|
|
||||||
Будь ласка, використовуйте Prettier із налаштуваннями за замовчуванням для форматування коду.
|
Будь ласка, використовуйте Prettier із налаштуваннями за замовчуванням для форматування коду.
|
||||||
|
|
||||||
#### Заздалегідь
|
#### Заздалегідь
|
||||||
|
|
||||||
Вам потрібно встановити node і npm, щоб створити bundled версію джерела.
|
Вам потрібно встановити node і npm, щоб створити bundled версію джерела.
|
||||||
|
|
||||||
Версії, що використовувались при налаштуванні:
|
Версії, що використовувались при налаштуванні:
|
||||||
|
|
||||||
- node: 12.18.4
|
- node: 12.18.4
|
||||||
- npm: 6.14.6
|
- npm: 6.14.6
|
||||||
|
|
||||||
Для створення `bundled-content-script.js`, який містить більшу частину бізнес-логіки цього розширення, спочатку потрібно встановити всі залежності.
|
Для створення `bundled-content-script.js`, який містить більшу частину бізнес-логіки цього розширення, спочатку потрібно встановити всі залежності.
|
||||||
|
|
||||||
1. Перейдіть в корінь репозиторію та виконайте наступне:
|
1. Перейдіть в корінь репозиторію та виконайте наступне:
|
||||||
|
|
||||||
```
|
```
|
||||||
npm install
|
npm install
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Виконайте наступну команду, щоб створити `bundled-content-script.js`, який використовується в `manifest.json`
|
2. Виконайте наступну команду, щоб створити `bundled-content-script.js`, який використовується в `manifest.json`
|
||||||
|
|
||||||
```
|
```
|
||||||
npm start // для створення файлу(ів) збірки та запуску спостерігача за файлами, який виконує hot-reload при збереженні
|
npm start // для створення файлу(ів) збірки та запуску спостерігача за файлами, який виконує hot-reload при збереженні
|
||||||
|
|
||||||
// або ж
|
// або ж
|
||||||
|
|
||||||
npm run build // для створення файлу(ів) збірки один раз
|
npm run build // для створення файлу(ів) збірки один раз
|
||||||
```
|
```
|
||||||
|
|
||||||
Вітаємо, тепер ви готові до розробки!
|
Вітаємо, тепер ви готові до розробки!
|
||||||
|
|
||||||
Якщо ви новачок у розробці розширення Chrome або вам потрібна додаткова допомога, перегляньте [це керівництво на YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) (англ.)
|
Якщо ви новачок у розробці розширення Chrome або вам потрібна додаткова допомога, перегляньте [це керівництво на YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) (англ.)
|
||||||
|
|
||||||
### Проблеми
|
### Проблеми
|
||||||
|
|
||||||
#### Відкриття нової проблеми
|
#### Відкриття нової проблеми
|
||||||
|
|
||||||
Якщо у вас виникли проблеми з розширенням, здійсніть пошук і переконайтеся, що про цю проблему ще не повідомляли. Якщо ні, створіть Issue, використання форми проблеми наполегливо рекомендується, але не є обов’язковим.
|
Якщо у вас виникли проблеми з розширенням, здійсніть пошук і переконайтеся, що про цю проблему ще не повідомляли. Якщо ні, створіть Issue, використання форми проблеми наполегливо рекомендується, але не є обов’язковим.
|
||||||
|
|
||||||
#### Вирішення проблеми
|
#### Вирішення проблеми
|
||||||
|
|
||||||
Якщо ви знайшли проблему, і гадаєте, що можете її вирішити, не соромтеся. Створіть Pull Request на вилучення з виправленням і обов'язково вкажіть проблему, яку ви усуваєте.
|
Якщо ви знайшли проблему, і гадаєте, що можете її вирішити, не соромтеся. Створіть Pull Request на вилучення з виправленням і обов'язково вкажіть проблему, яку ви усуваєте.
|
||||||
|
|
||||||
### Запит функції
|
### Запит функції
|
||||||
|
|
||||||
#### Відкриття запиту на нову функцію
|
#### Відкриття запиту на нову функцію
|
||||||
|
|
||||||
Якщо у вас є ідея щодо розширення, не соромтеся створіть Pull Request, але, будь ласка, здійсніть пошук і переконайтеся, що ця функція ще не запропонована. Використання форми функції наполегливо рекомендується, але не є обов’язковим.
|
Якщо у вас є ідея щодо розширення, не соромтеся створіть Pull Request, але, будь ласка, здійсніть пошук і переконайтеся, що ця функція ще не запропонована. Використання форми функції наполегливо рекомендується, але не є обов’язковим.
|
||||||
|
|
||||||
#### Реалізація запиту функції
|
#### Реалізація запиту функції
|
||||||
|
|
||||||
Якщо ви знайшли функцію, і гадаєте, що можете її реалізувати, не соромтеся. Створіть Pull Request із виправленням і обов’язково вкажіть функцію, яку ви впроваджуєте.
|
Якщо ви знайшли функцію, і гадаєте, що можете її реалізувати, не соромтеся. Створіть Pull Request із виправленням і обов’язково вкажіть функцію, яку ви впроваджуєте.
|
||||||
|
|
||||||
### Які Pull Request ми приймаємо?
|
### Які Pull Request ми приймаємо?
|
||||||
|
|
||||||
- Виправлення проблем.
|
- Виправлення проблем.
|
||||||
- Впровадження нових функцій.
|
- Впровадження нових функцій.
|
||||||
- Виправлення помилок та спрощення тексту.
|
- Виправлення помилок та спрощення тексту.
|
||||||
- Поліпшення сайту.
|
- Поліпшення сайту.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
Read this in other languages: [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
Read this in other languages: [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Frequently Asked Questions
|
# Frequently Asked Questions
|
||||||
|
|
||||||
## Before asking a question on GitHub or Discord, please refer to this.
|
## Before asking a question on GitHub or Discord, please refer to this.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
Lisez ceci dans d'autres langues : [English](FAQ.md), [русский](FAQru.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
Lisez ceci dans d'autres langues : [English](FAQ.md), [русский](FAQru.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Foire Aux Questions
|
# Foire Aux Questions
|
||||||
|
|
||||||
## Avant de poser une question sur GitHub ou Discord, veuillez vous référer à ceci.
|
## Avant de poser une question sur GitHub ou Discord, veuillez vous référer à ceci.
|
||||||
|
|||||||
+2
-3
@@ -1,5 +1,4 @@
|
|||||||
Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md)
|
Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md)
|
||||||
|
|
||||||
|
|
||||||
# Często zadawane pytania
|
# Często zadawane pytania
|
||||||
|
|
||||||
@@ -17,7 +16,7 @@ Zapisujemy wszystkie dostępne dane do naszej bazy danych, żeby były dostępne
|
|||||||
|
|
||||||
### **2. Licznik łapek w dół się nie aktualizuje**
|
### **2. Licznik łapek w dół się nie aktualizuje**
|
||||||
|
|
||||||
Na chwile obecną łapki w dół są buforowane i nie są bardzo często aktualizowane. Raz na 2-3 dni, nie częściej.
|
Na chwile obecną łapki w dół są buforowane i nie są bardzo często aktualizowane. Raz na 2-3 dni, nie częściej.
|
||||||
|
|
||||||
No nie jest to idealne, ale tak już jest. Pracujemy nad tym jak częściej możemy to aktualizować.
|
No nie jest to idealne, ale tak już jest. Pracujemy nad tym jak częściej możemy to aktualizować.
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -1,25 +1,29 @@
|
|||||||
Read this in other languages: [English](FAQ.md), [Nederlands](FAQnl.md), Français](FAQfr.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
Read this in other languages: [English](FAQ.md), [Nederlands](FAQnl.md), Français](FAQfr.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Часто задаваемые вопросы
|
# Часто задаваемые вопросы
|
||||||
|
|
||||||
## Прежде чем задать вопрос на GitHub или в Discord, пожалуйста, ознакомьтесь с этим.
|
## Прежде чем задать вопрос на GitHub или в Discord, пожалуйста, ознакомьтесь с этим.
|
||||||
|
|
||||||
### **1. Откуда это расширение получает данные?**
|
### **1. Откуда это расширение получает данные?**
|
||||||
|
|
||||||
Комбинация API Google и старых данных.
|
Комбинация API Google и старых данных.
|
||||||
|
|
||||||
Мы сохраняем все имеющиеся данные в нашей базе данных, чтобы они были доступны после того, как Google прекратит подсчёт отметок «Не нравится» в своём API.
|
Мы сохраняем все имеющиеся данные в нашей базе данных, чтобы они были доступны после того, как Google прекратит подсчёт отметок «Не нравится» в своём API.
|
||||||
|
|
||||||
### **2. Количество не понравившихся видео не обновляется**
|
### **2. Количество не понравившихся видео не обновляется**
|
||||||
|
|
||||||
В настоящее время видео с отметками «Не нравится» кэшируются и обновляются не очень часто. Раз в 2-3 дня, не чаще.
|
В настоящее время видео с отметками «Не нравится» кэшируются и обновляются не очень часто. Раз в 2-3 дня, не чаще.
|
||||||
|
|
||||||
Да, это не идеально, но это то, что есть. Мы работаем над тем, чтобы улучшить частоту их обновления.
|
Да, это не идеально, но это то, что есть. Мы работаем над тем, чтобы улучшить частоту их обновления.
|
||||||
|
|
||||||
### **3. Как это работает?**
|
### **3. Как это работает?**
|
||||||
|
|
||||||
Расширение собирает идентификатор видео, которое вы смотрите, извлекает данные об отметках «Не нравится» (и другие поля, такие как просмотры, отметки «Нравится» и т.д.) с помощью нашего API, если видео было извлечено нашим API впервые, оно использует YouTube API для получения данных, затем сохраняет данные в базе данных для кэширования (кэшируются около 2-3 дней) и архивирования и возвращает их вам. После этого расширение отображает отметки «Не нравится» вам.
|
Расширение собирает идентификатор видео, которое вы смотрите, извлекает данные об отметках «Не нравится» (и другие поля, такие как просмотры, отметки «Нравится» и т.д.) с помощью нашего API, если видео было извлечено нашим API впервые, оно использует YouTube API для получения данных, затем сохраняет данные в базе данных для кэширования (кэшируются около 2-3 дней) и архивирования и возвращает их вам. После этого расширение отображает отметки «Не нравится» вам.
|
||||||
|
|
||||||
### **4. Что произойдёт после того, как API YouTube перестанет возвращать данные о количестве отметок «Не нравится»?**
|
### **4. Что произойдёт после того, как API YouTube перестанет возвращать данные о количестве отметок «Не нравится»?**
|
||||||
|
|
||||||
Внутренняя часть нашего сервера переключится на использование комбинации архивных статистик отметок «Не нравится», оценок, экстраполированных из данных о пользователях расширения, и оценок, основанных на соотношении просмотров и отметок «Нравится» для видео, чьи отметки «Не нравится» не были заархивированы, и для устаревших архивов с отметками «Не нравится».
|
Внутренняя часть нашего сервера переключится на использование комбинации архивных статистик отметок «Не нравится», оценок, экстраполированных из данных о пользователях расширения, и оценок, основанных на соотношении просмотров и отметок «Нравится» для видео, чьи отметки «Не нравится» не были заархивированы, и для устаревших архивов с отметками «Не нравится».
|
||||||
|
|
||||||
## Я беспокоюсь о безопасности / конфиденциальности
|
## Я беспокоюсь о безопасности / конфиденциальности
|
||||||
|
|
||||||
Более подробную информацию смотрите на [этой странице](SECURITY-FAQ.md).
|
Более подробную информацию смотрите на [этой странице](SECURITY-FAQ.md).
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
Bunu diğer dillerde okuyun: [English](FAQ.md), [русский](FAQru.md), ), [Nederlands](FAQnl.md), [Français](FAQfr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
Bunu diğer dillerde okuyun: [English](FAQ.md), [русский](FAQru.md), ), [Nederlands](FAQnl.md), [Français](FAQfr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Sıkça Sorulan Sorular
|
# Sıkça Sorulan Sorular
|
||||||
|
|
||||||
## GitHub'da veya Discord'da bir soru sormadan önce, lütfen buraya göz atın.
|
## GitHub'da veya Discord'da bir soru sormadan önce, lütfen buraya göz atın.
|
||||||
|
|||||||
+61
-61
@@ -1,61 +1,61 @@
|
|||||||
Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md)
|
Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md)
|
||||||
|
|
||||||
# Часті питання
|
# Часті питання
|
||||||
|
|
||||||
## Перш ніж задавати питання на GitHub або у Discord, будь ласка, ознайомтеся з цим.
|
## Перш ніж задавати питання на GitHub або у Discord, будь ласка, ознайомтеся з цим.
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
### **1. Звідки це розширення отримує дані?**
|
### **1. Звідки це розширення отримує дані?**
|
||||||
|
|
||||||
Комбінація Google API та старих даних.
|
Комбінація Google API та старих даних.
|
||||||
|
|
||||||
Ми зберігаємо всі доступні дані в нашій базі, аби вони були доступні після того, як Google вимкне лічильник відміток «Не подобається» у своєму API.
|
Ми зберігаємо всі доступні дані в нашій базі, аби вони були доступні після того, як Google вимкне лічильник відміток «Не подобається» у своєму API.
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
### **2. Лічильник «Не подобається» не оновлюється**
|
### **2. Лічильник «Не подобається» не оновлюється**
|
||||||
|
|
||||||
Наразі відео з відмітками «Не подобається» кешуються і оновлюються не надто часто. Не частіше, ніж раз в 2-3 дні.
|
Наразі відео з відмітками «Не подобається» кешуються і оновлюються не надто часто. Не частіше, ніж раз в 2-3 дні.
|
||||||
|
|
||||||
Так, це не ідеально, але маємо те, що маємо. Ми працюємо над тим, щоб збільшити частоту їх оновлення.
|
Так, це не ідеально, але маємо те, що маємо. Ми працюємо над тим, щоб збільшити частоту їх оновлення.
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
### **3. Як це працює?**
|
### **3. Як це працює?**
|
||||||
|
|
||||||
Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API, якщо відео було витягнуте нашим API вперше, воно використовує YouTube API для отримання даних, потім зберігає дані в базі даних для кешування (кешуються близько 2-3 днів) та архівування й повертає їх вам. Після цього розширення відображає відмітки «Не подобається» вам.
|
Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API, якщо відео було витягнуте нашим API вперше, воно використовує YouTube API для отримання даних, потім зберігає дані в базі даних для кешування (кешуються близько 2-3 днів) та архівування й повертає їх вам. Після цього розширення відображає відмітки «Не подобається» вам.
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
### **4. Що станеться після того, як YouTube API перестане повертати кількість відміток «Не подобається»?**
|
### **4. Що станеться після того, як YouTube API перестане повертати кількість відміток «Не подобається»?**
|
||||||
|
|
||||||
Сервер перейде на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними .
|
Сервер перейде на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними .
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
### **5. Як розраховується кількість відміток «Не подобається»?**
|
### **5. Як розраховується кількість відміток «Не подобається»?**
|
||||||
|
|
||||||
RYD використовує відмітки своїх користувачів, щоб екстраполювати кількість відміток «Не подобається».
|
RYD використовує відмітки своїх користувачів, щоб екстраполювати кількість відміток «Не подобається».
|
||||||
|
|
||||||
- Якщо відео було завантажено після вимкнення API:
|
- Якщо відео було завантажено після вимкнення API:
|
||||||
|
|
||||||
$$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Подобається» серед користувачів RYD}}{\textup{К-ть відміток «Не подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$
|
$$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Подобається» серед користувачів RYD}}{\textup{К-ть відміток «Не подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$
|
||||||
|
|
||||||
- Якщо база даних RYD якимось чином мала фактичну кількість відміток «Подобається» та «Не подобається» (надану завантажувачем або з архіву), кількість відміток «Не подобається» буде розраховано на основі відміток користувачів і архівного значення. Архівне значення матиме менший вплив на остаточний підрахунок у міру актуальності.
|
- Якщо база даних RYD якимось чином мала фактичну кількість відміток «Подобається» та «Не подобається» (надану завантажувачем або з архіву), кількість відміток «Не подобається» буде розраховано на основі відміток користувачів і архівного значення. Архівне значення матиме менший вплив на остаточний підрахунок у міру актуальності.
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Це все, але у відео форматі
|
Це все, але у відео форматі
|
||||||
|
|
||||||
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## Я турбуюся про безпеку/конфіденційність
|
## Я турбуюся про безпеку/конфіденційність
|
||||||
|
|
||||||
Детальніше про це дивіться [тут](SECURITY-FAQuk.md).
|
Детальніше про це дивіться [тут](SECURITY-FAQuk.md).
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
Read this in other languages: [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md)
|
Read this in other languages: [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Security
|
# Security
|
||||||
|
|
||||||
### Are you tracking my viewing history?
|
### Are you tracking my viewing history?
|
||||||
|
|||||||
+10
-10
@@ -4,27 +4,27 @@ Lees dit in andere talen: [English](SECURITY_FAQ.md), [русский](SECURITY-
|
|||||||
|
|
||||||
### Houd je mijn kijkgeschiedenis bij?
|
### Houd je mijn kijkgeschiedenis bij?
|
||||||
|
|
||||||
Nee. De code van de extensie is openbaar en u kunt deze zelf zien. De enige informatie die wordt verzonden, is de video-ID, die
|
Nee. De code van de extensie is openbaar en u kunt deze zelf zien. De enige informatie die wordt verzonden, is de video-ID, die
|
||||||
nodig is om het aantal dislikes voor de video's op te halen. Er worden geen extra headers verzonden. Via de communicatielaag
|
nodig is om het aantal dislikes voor de video's op te halen. Er worden geen extra headers verzonden. Via de communicatielaag
|
||||||
wordt uw openbare IP-adres zichtbaar voor de server, evenals het tijdstip waarop het verzoek is gedaan. Geen van deze
|
wordt uw openbare IP-adres zichtbaar voor de server, evenals het tijdstip waarop het verzoek is gedaan. Geen van deze
|
||||||
identificeert u echter op enigerlei wijze uniek. Uitgaande van een zero-trust-omgeving, is het beste wat we kunnen krijgen een
|
identificeert u echter op enigerlei wijze uniek. Uitgaande van een zero-trust-omgeving, is het beste wat we kunnen krijgen een
|
||||||
dynamisch IP-adres. Wat vandaag van jou is, morgen van je buurman. Als u zich echt zorgen maakt dat uw IP-adres wordt
|
dynamisch IP-adres. Wat vandaag van jou is, morgen van je buurman. Als u zich echt zorgen maakt dat uw IP-adres wordt
|
||||||
getraceerd, gebruikt u waarschijnlijk al een VPN.
|
getraceerd, gebruikt u waarschijnlijk al een VPN.
|
||||||
|
|
||||||
### Kun je me uniek identificeren als ik een hekel heb?
|
### Kun je me uniek identificeren als ik een hekel heb?
|
||||||
|
|
||||||
Ja. Als je een video niet leuk vindt, maken we een willekeurig gegenereerde unieke ID voor je die niet is gekoppeld aan je
|
Ja. Als je een video niet leuk vindt, maken we een willekeurig gegenereerde unieke ID voor je die niet is gekoppeld aan je
|
||||||
Google-account. Dit wordt gedaan om botting te voorkomen. Maar er is geen manier om deze willekeurige id aan jou of je
|
Google-account. Dit wordt gedaan om botting te voorkomen. Maar er is geen manier om deze willekeurige id aan jou of je
|
||||||
persoonlijke YouTube-account te koppelen.
|
persoonlijke YouTube-account te koppelen.
|
||||||
|
|
||||||
### Welke informatie heb je precies?
|
### Welke informatie heb je precies?
|
||||||
|
|
||||||
Alleen de video-ID. Niet je opmerkingen, niet je gebruikersnaam, niet met wie je de video hebt gedeeld, geen aanvullende
|
Alleen de video-ID. Niet je opmerkingen, niet je gebruikersnaam, niet met wie je de video hebt gedeeld, geen aanvullende
|
||||||
metadata. Niks. Alleen de video-ID.
|
metadata. Niks. Alleen de video-ID.
|
||||||
|
|
||||||
### Hoe wordt mijn IP opgeslagen?
|
### Hoe wordt mijn IP opgeslagen?
|
||||||
|
|
||||||
De backend bewaart niet-gehashte IP-adressen alleen in vluchtig geheugen (RAM). Deze adressen worden niet opgeslagen op een
|
De backend bewaart niet-gehashte IP-adressen alleen in vluchtig geheugen (RAM). Deze adressen worden niet opgeslagen op een
|
||||||
harde schijf en worden daarom niet gelogd. We hashen de IP-adressen en dat wordt in plaats daarvan opgeslagen. Dit wordt gedaan
|
harde schijf en worden daarom niet gelogd. We hashen de IP-adressen en dat wordt in plaats daarvan opgeslagen. Dit wordt gedaan
|
||||||
om databasevandalisme te voorkomen.
|
om databasevandalisme te voorkomen.
|
||||||
|
|
||||||
@@ -38,4 +38,4 @@ We hebben maatregelen genomen om botaanvallen te voorkomen en zullen blijven wer
|
|||||||
|
|
||||||
### Waarom deel je de backend-code niet?
|
### Waarom deel je de backend-code niet?
|
||||||
|
|
||||||
We zullen het op een gegeven moment delen - maar er is echt geen echte reden om het nu te delen. Het geeft een vals gevoel van veiligheid - omdat we in een zero-trust-systeem net zo goed de ene versie kunnen onthullen, maar een andere kunnen implementeren. Er zijn tal van redenen om de code verborgen te houden, met name hoe we spam bestrijden. Het verbergen/verduisteren van de spamverwerkingscode is een vrij standaardpraktijk.
|
We zullen het op een gegeven moment delen - maar er is echt geen echte reden om het nu te delen. Het geeft een vals gevoel van veiligheid - omdat we in een zero-trust-systeem net zo goed de ene versie kunnen onthullen, maar een andere kunnen implementeren. Er zijn tal van redenen om de code verborgen te houden, met name hoe we spam bestrijden. Het verbergen/verduisteren van de spamverwerkingscode is een vrij standaardpraktijk.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md)
|
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md)
|
||||||
|
|
||||||
|
|
||||||
# Security
|
# Security
|
||||||
|
|
||||||
### Czy śledzicie moją historię wyświetleń?
|
### Czy śledzicie moją historię wyświetleń?
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md)
|
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md)
|
||||||
|
|
||||||
# Güvenlik
|
# Güvenlik
|
||||||
|
|
||||||
|
|||||||
+31
-31
@@ -1,31 +1,31 @@
|
|||||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [Polski](SECURITY-FAQpl.md)
|
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [Polski](SECURITY-FAQpl.md)
|
||||||
|
|
||||||
# Безпека
|
# Безпека
|
||||||
|
|
||||||
### Ви відстежуєте мою історію переглядів?
|
### Ви відстежуєте мою історію переглядів?
|
||||||
|
|
||||||
Ні. Код розширення знаходиться у відкритому доступі, і ви можете ознайомитись з ним самостійно. Єдина інформація, що передається - це ID відео, який необхідний для отримання даних про кількість відміток. Жодних додаткових заголовків не передається. На комунікаційному рівні серверу буде передано вашу публічну IP-адресу, а також час, коли було зроблено запит. Однак ніщо з цього ніяк не здатно вас ідентифіквати. Припускаючи середовище з нульовою довірою, найцінніше, що ми можемо отримати це динамічний IP. Який сьогодні ваш, а завтра – вашого сусіда. Якщо ви дійсно турбуєтеся про те, що ваш IP може бути відстежений, ви, ймовірно, вже використовуєте якийсь VPN.
|
Ні. Код розширення знаходиться у відкритому доступі, і ви можете ознайомитись з ним самостійно. Єдина інформація, що передається - це ID відео, який необхідний для отримання даних про кількість відміток. Жодних додаткових заголовків не передається. На комунікаційному рівні серверу буде передано вашу публічну IP-адресу, а також час, коли було зроблено запит. Однак ніщо з цього ніяк не здатно вас ідентифіквати. Припускаючи середовище з нульовою довірою, найцінніше, що ми можемо отримати це динамічний IP. Який сьогодні ваш, а завтра – вашого сусіда. Якщо ви дійсно турбуєтеся про те, що ваш IP може бути відстежений, ви, ймовірно, вже використовуєте якийсь VPN.
|
||||||
|
|
||||||
### Чи можете ви однозначно ідентифікувати мене, коли я залишаю відмітку «Не подобається»?
|
### Чи можете ви однозначно ідентифікувати мене, коли я залишаю відмітку «Не подобається»?
|
||||||
|
|
||||||
Так. Коли ви залишаєте відео позначку «Не подобається», ми створюємо для вас випадковий унікальний ID, який не прив'язаний до вашого облікового запису Google. Це робиться для уникнення атаки ботів. Але немає жодного способу зв'язати цей випадковий ID до вас або вашого особистого облікового запису YouTube.
|
Так. Коли ви залишаєте відео позначку «Не подобається», ми створюємо для вас випадковий унікальний ID, який не прив'язаний до вашого облікового запису Google. Це робиться для уникнення атаки ботів. Але немає жодного способу зв'язати цей випадковий ID до вас або вашого особистого облікового запису YouTube.
|
||||||
|
|
||||||
### Якою саме інформацією ви володієте?
|
### Якою саме інформацією ви володієте?
|
||||||
|
|
||||||
Лише ID відео. Ні ваших коментарів, ні вашого імені користувача, ні того, з ким ви поділилися відео, ні будь-яких інших додаткових метаданих. Нічого. Лише ID відео.
|
Лише ID відео. Ні ваших коментарів, ні вашого імені користувача, ні того, з ким ви поділилися відео, ні будь-яких інших додаткових метаданих. Нічого. Лише ID відео.
|
||||||
|
|
||||||
### Як зберігається моя IP-адреса?
|
### Як зберігається моя IP-адреса?
|
||||||
|
|
||||||
Внутрішня частина нашого сервера зберігає нехешовані IP-адреси лише в енергозалежній пам'яті (ОЗП). Ці адреси не зберігаються на жорсткому диску і тому ніде не записані. Ми хешуємо IP-адреси, і вони зберігаються замість інших. Це зроблено для запобігання вандалізму у базі даних.
|
Внутрішня частина нашого сервера зберігає нехешовані IP-адреси лише в енергозалежній пам'яті (ОЗП). Ці адреси не зберігаються на жорсткому диску і тому ніде не записані. Ми хешуємо IP-адреси, і вони зберігаються замість інших. Це зроблено для запобігання вандалізму у базі даних.
|
||||||
|
|
||||||
### Я чув дискусію щодо OAuth і доступу до мого облікового запису YouTube!
|
### Я чув дискусію щодо OAuth і доступу до мого облікового запису YouTube!
|
||||||
|
|
||||||
Ця функція буде необов'язковою та дуже необхідною. Якщо ви творець YouTube і хочете поділитися з нами кількістю ваших відміток «Не подобається», ви зможете це зробити. За структурою [OAuth](https://uk.wikipedia.org/wiki/OAuth#:~:text=%D0%B1%D0%B5%D0%B7%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D1%96%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%96%20%D0%B2%D0%B2%D0%BE%D0%B4%D1%83%20%D1%96%D0%BC%D0%B5%D0%BD%D1%96%20%D0%BA%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87%D0%B0%20%D1%82%D0%B0%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8E) надбезпечний. Ви зможете відкликати доступ до свого облікового запису в будь-яку мить, і зможете дати нам обмежені дозволи. Ми не будемо вимагати жодних дозволів, крім необжідних. Ми будемо вимагати лише дозволи перегляду статистики ваших відео.
|
Ця функція буде необов'язковою та дуже необхідною. Якщо ви творець YouTube і хочете поділитися з нами кількістю ваших відміток «Не подобається», ви зможете це зробити. За структурою [OAuth](https://uk.wikipedia.org/wiki/OAuth#:~:text=%D0%B1%D0%B5%D0%B7%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D1%96%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%96%20%D0%B2%D0%B2%D0%BE%D0%B4%D1%83%20%D1%96%D0%BC%D0%B5%D0%BD%D1%96%20%D0%BA%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87%D0%B0%20%D1%82%D0%B0%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8E) надбезпечний. Ви зможете відкликати доступ до свого облікового запису в будь-яку мить, і зможете дати нам обмежені дозволи. Ми не будемо вимагати жодних дозволів, крім необжідних. Ми будемо вимагати лише дозволи перегляду статистики ваших відео.
|
||||||
|
|
||||||
### Наскільки достовірна ця кількость відміток «Не подобається»?
|
### Наскільки достовірна ця кількость відміток «Не подобається»?
|
||||||
|
|
||||||
Ми вжили заходів щодо запобігання атакам ботів і збираємося продовжувати працювати над підвищенням ефективності цієї сисеми надалі: це допоможе нам зберегти підрахунок відміток «Не подобається» як хороше представлення фактичної кількості. Звичайно, він ніколи не буде точним на всі 100%, тож ви самі вирішуєте, довіряти йому чи ні.
|
Ми вжили заходів щодо запобігання атакам ботів і збираємося продовжувати працювати над підвищенням ефективності цієї сисеми надалі: це допоможе нам зберегти підрахунок відміток «Не подобається» як хороше представлення фактичної кількості. Звичайно, він ніколи не буде точним на всі 100%, тож ви самі вирішуєте, довіряти йому чи ні.
|
||||||
|
|
||||||
### Чому б вам не поділитися внутрішнім кодом вашого сервера?
|
### Чому б вам не поділитися внутрішнім кодом вашого сервера?
|
||||||
|
|
||||||
Ми поділимося ним у якийсь момент – але зараз немає жодних причин це робити. Це дасть хибне почуття безпеки - адже в системі з нульовою довірою ми можемо з таким самим успіхом поділитися однією версією, але розгорнути іншу. Є багато причин тримати код у таємниці, зокрема, як ми боремося зі спамом. Приховування та затьмарення коду обробки спаму є доволі стандартною практикою.
|
Ми поділимося ним у якийсь момент – але зараз немає жодних причин це робити. Це дасть хибне почуття безпеки - адже в системі з нульовою довірою ми можемо з таким самим успіхом поділитися однією версією, але розгорнути іншу. Є багато причин тримати код у таємниці, зокрема, як ми боремося зі спамом. Приховування та затьмарення коду обробки спаму є доволі стандартною практикою.
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ const extConfig = {
|
|||||||
numberDisplayRoundDown: true, // [true*, false] Round down numbers (Show rounded down numbers)
|
numberDisplayRoundDown: true, // [true*, false] Round down numbers (Show rounded down numbers)
|
||||||
tooltipPercentageMode: "none", // [none*, dash_like, dash_dislike, both, only_like, only_dislike] Mode of showing percentage in like/dislike bar tooltip.
|
tooltipPercentageMode: "none", // [none*, dash_like, dash_dislike, both, only_like, only_dislike] Mode of showing percentage in like/dislike bar tooltip.
|
||||||
numberDisplayReformatLikes: false, // [true, false*] Re-format like numbers (Make likes and dislikes format consistent)
|
numberDisplayReformatLikes: false, // [true, false*] Re-format like numbers (Make likes and dislikes format consistent)
|
||||||
rateBarEnabled: false // [true, false*] Enables ratio bar under like/dislike buttons
|
rateBarEnabled: false, // [true, false*] Enables ratio bar under like/dislike buttons
|
||||||
// END USER OPTIONS
|
// END USER OPTIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ function getButtons() {
|
|||||||
let elements = document.querySelectorAll(
|
let elements = document.querySelectorAll(
|
||||||
isMobile
|
isMobile
|
||||||
? "ytm-like-button-renderer"
|
? "ytm-like-button-renderer"
|
||||||
: "#like-button > ytd-like-button-renderer"
|
: "#like-button > ytd-like-button-renderer",
|
||||||
);
|
);
|
||||||
for (let element of elements) {
|
for (let element of elements) {
|
||||||
if (isInViewport(element)) {
|
if (isInViewport(element)) {
|
||||||
@@ -85,14 +85,17 @@ function getButtons() {
|
|||||||
}
|
}
|
||||||
if (isMobile) {
|
if (isMobile) {
|
||||||
return (
|
return (
|
||||||
document.querySelector(".slim-video-action-bar-actions .segmented-buttons") ??
|
document.querySelector(
|
||||||
document.querySelector(".slim-video-action-bar-actions")
|
".slim-video-action-bar-actions .segmented-buttons",
|
||||||
|
) ?? document.querySelector(".slim-video-action-bar-actions")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (document.getElementById("menu-container")?.offsetParent === null) {
|
if (document.getElementById("menu-container")?.offsetParent === null) {
|
||||||
return (
|
return (
|
||||||
document.querySelector("ytd-menu-renderer.ytd-watch-metadata > div") ??
|
document.querySelector("ytd-menu-renderer.ytd-watch-metadata > div") ??
|
||||||
document.querySelector("ytd-menu-renderer.ytd-video-primary-info-renderer > div")
|
document.querySelector(
|
||||||
|
"ytd-menu-renderer.ytd-video-primary-info-renderer > div",
|
||||||
|
)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return document
|
return document
|
||||||
@@ -102,17 +105,22 @@ function getButtons() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getDislikeButton() {
|
function getDislikeButton() {
|
||||||
if (getButtons().children[0].tagName ===
|
if (
|
||||||
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER")
|
getButtons().children[0].tagName ===
|
||||||
{
|
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||||
|
) {
|
||||||
if (getButtons().children[0].children[1] === undefined) {
|
if (getButtons().children[0].children[1] === undefined) {
|
||||||
return document.querySelector("#segmented-dislike-button");
|
return document.querySelector("#segmented-dislike-button");
|
||||||
} else {
|
} else {
|
||||||
return getButtons().children[0].children[1];
|
return getButtons().children[0].children[1];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (getButtons().querySelector("segmented-like-dislike-button-view-model")) {
|
if (
|
||||||
const dislikeViewModel = getButtons().querySelector("dislike-button-view-model");
|
getButtons().querySelector("segmented-like-dislike-button-view-model")
|
||||||
|
) {
|
||||||
|
const dislikeViewModel = getButtons().querySelector(
|
||||||
|
"dislike-button-view-model",
|
||||||
|
);
|
||||||
if (!dislikeViewModel) cLog("Dislike button wasn't added to DOM yet...");
|
if (!dislikeViewModel) cLog("Dislike button wasn't added to DOM yet...");
|
||||||
return dislikeViewModel;
|
return dislikeViewModel;
|
||||||
} else {
|
} else {
|
||||||
@@ -123,9 +131,12 @@ function getDislikeButton() {
|
|||||||
|
|
||||||
function getLikeButton() {
|
function getLikeButton() {
|
||||||
return getButtons().children[0].tagName ===
|
return getButtons().children[0].tagName ===
|
||||||
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||||
? document.querySelector("#segmented-like-button") !== null ? document.querySelector("#segmented-like-button") : getButtons().children[0].children[0]
|
? document.querySelector("#segmented-like-button") !== null
|
||||||
: getButtons().querySelector("like-button-view-model") ?? getButtons().children[0];
|
? document.querySelector("#segmented-like-button")
|
||||||
|
: getButtons().children[0].children[0]
|
||||||
|
: getButtons().querySelector("like-button-view-model") ??
|
||||||
|
getButtons().children[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLikeTextContainer() {
|
function getLikeTextContainer() {
|
||||||
@@ -136,19 +147,19 @@ function getLikeTextContainer() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getDislikeTextContainer() {
|
function getDislikeTextContainer() {
|
||||||
const dislikeButton = getDislikeButton();
|
const dislikeButton = getDislikeButton();
|
||||||
let result =
|
let result =
|
||||||
dislikeButton?.querySelector("#text") ??
|
dislikeButton?.querySelector("#text") ??
|
||||||
dislikeButton?.getElementsByTagName("yt-formatted-string")[0] ??
|
dislikeButton?.getElementsByTagName("yt-formatted-string")[0] ??
|
||||||
dislikeButton?.querySelector("span[role='text']")
|
dislikeButton?.querySelector("span[role='text']");
|
||||||
if (result === null) {
|
if (result === null) {
|
||||||
let textSpan = document.createElement("span");
|
let textSpan = document.createElement("span");
|
||||||
textSpan.id = "text";
|
textSpan.id = "text";
|
||||||
textSpan.style.marginLeft = "6px";
|
textSpan.style.marginLeft = "6px";
|
||||||
dislikeButton?.querySelector("button").appendChild(textSpan);
|
dislikeButton?.querySelector("button").appendChild(textSpan);
|
||||||
if (dislikeButton) dislikeButton.querySelector("button").style.width = "auto";
|
if (dislikeButton)
|
||||||
|
dislikeButton.querySelector("button").style.width = "auto";
|
||||||
result = textSpan;
|
result = textSpan;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -158,8 +169,12 @@ function createObserver(options, callback) {
|
|||||||
const observerWrapper = new Object();
|
const observerWrapper = new Object();
|
||||||
observerWrapper.options = options;
|
observerWrapper.options = options;
|
||||||
observerWrapper.observer = new MutationObserver(callback);
|
observerWrapper.observer = new MutationObserver(callback);
|
||||||
observerWrapper.observe = function (element) { this.observer.observe(element, this.options); }
|
observerWrapper.observe = function (element) {
|
||||||
observerWrapper.disconnect = function () { this.observer.disconnect(); }
|
this.observer.observe(element, this.options);
|
||||||
|
};
|
||||||
|
observerWrapper.disconnect = function () {
|
||||||
|
this.observer.disconnect();
|
||||||
|
};
|
||||||
return observerWrapper;
|
return observerWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,31 +182,36 @@ let shortsObserver = null;
|
|||||||
|
|
||||||
if (isShorts() && !shortsObserver) {
|
if (isShorts() && !shortsObserver) {
|
||||||
cLog("Initializing shorts mutation observer");
|
cLog("Initializing shorts mutation observer");
|
||||||
shortsObserver = createObserver({
|
shortsObserver = createObserver(
|
||||||
attributes: true
|
{
|
||||||
}, (mutationList) => {
|
attributes: true,
|
||||||
mutationList.forEach((mutation) => {
|
},
|
||||||
if (
|
(mutationList) => {
|
||||||
mutation.type === "attributes" &&
|
mutationList.forEach((mutation) => {
|
||||||
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
if (
|
||||||
mutation.target.id === "button"
|
mutation.type === "attributes" &&
|
||||||
) {
|
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
||||||
cLog("Short thumb button status changed");
|
mutation.target.id === "button"
|
||||||
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
) {
|
||||||
mutation.target.style.color =
|
cLog("Short thumb button status changed");
|
||||||
mutation.target.parentElement.parentElement.id === "like-button"
|
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
||||||
? getColorFromTheme(true)
|
mutation.target.style.color =
|
||||||
: getColorFromTheme(false);
|
mutation.target.parentElement.parentElement.id === "like-button"
|
||||||
} else {
|
? getColorFromTheme(true)
|
||||||
mutation.target.style.color = "unset";
|
: getColorFromTheme(false);
|
||||||
|
} else {
|
||||||
|
mutation.target.style.color = "unset";
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
cLog(
|
||||||
}
|
"Unexpected mutation observer event: " +
|
||||||
cLog(
|
mutation.target +
|
||||||
"Unexpected mutation observer event: " + mutation.target + mutation.type
|
mutation.type,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isVideoLiked() {
|
function isVideoLiked() {
|
||||||
@@ -263,7 +283,7 @@ function setDislikes(dislikesCount) {
|
|||||||
mobileDislikes = dislikesCount;
|
mobileDislikes = dislikesCount;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
getDislikeTextContainer()?.removeAttribute('is-empty');
|
getDislikeTextContainer()?.removeAttribute("is-empty");
|
||||||
getDislikeTextContainer().innerText = dislikesCount;
|
getDislikeTextContainer().innerText = dislikesCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,18 +294,15 @@ function getLikeCountFromButton() {
|
|||||||
//It should be possible to fix this function, but it's not critical to showing the dislike count.
|
//It should be possible to fix this function, but it's not critical to showing the dislike count.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let likeButton = getLikeButton()
|
let likeButton =
|
||||||
.querySelector("yt-formatted-string#text") ??
|
getLikeButton().querySelector("yt-formatted-string#text") ??
|
||||||
getLikeButton().querySelector("button");
|
getLikeButton().querySelector("button");
|
||||||
|
|
||||||
let likesStr = likeButton.getAttribute("aria-label")
|
let likesStr = likeButton.getAttribute("aria-label").replace(/\D/g, "");
|
||||||
.replace(/\D/g, "");
|
|
||||||
return likesStr.length > 0 ? parseInt(likesStr) : false;
|
return likesStr.length > 0 ? parseInt(likesStr) : false;
|
||||||
}
|
} catch {
|
||||||
catch {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(typeof GM_addStyle != "undefined"
|
(typeof GM_addStyle != "undefined"
|
||||||
@@ -339,8 +356,7 @@ function createRateBar(likes, dislikes) {
|
|||||||
let rateBar = document.getElementById("return-youtube-dislike-bar-container");
|
let rateBar = document.getElementById("return-youtube-dislike-bar-container");
|
||||||
|
|
||||||
const widthPx =
|
const widthPx =
|
||||||
getLikeButton().clientWidth +
|
getLikeButton().clientWidth + (getDislikeButton()?.clientWidth ?? 52);
|
||||||
(getDislikeButton()?.clientWidth ?? 52);
|
|
||||||
|
|
||||||
const widthPercent =
|
const widthPercent =
|
||||||
likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
|
likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
|
||||||
@@ -397,25 +413,23 @@ function createRateBar(likes, dislikes) {
|
|||||||
<!--css-build:shady-->${tooltipInnerHTML}
|
<!--css-build:shady-->${tooltipInnerHTML}
|
||||||
</tp-yt-paper-tooltip>
|
</tp-yt-paper-tooltip>
|
||||||
</div>
|
</div>
|
||||||
`
|
`,
|
||||||
);
|
);
|
||||||
let descriptionAndActionsElement = document.getElementById("top-row");
|
let descriptionAndActionsElement = document.getElementById("top-row");
|
||||||
descriptionAndActionsElement.style.borderBottom =
|
descriptionAndActionsElement.style.borderBottom =
|
||||||
"1px solid var(--yt-spec-10-percent-layer)";
|
"1px solid var(--yt-spec-10-percent-layer)";
|
||||||
descriptionAndActionsElement.style.paddingBottom = "10px";
|
descriptionAndActionsElement.style.paddingBottom = "10px";
|
||||||
} else {
|
} else {
|
||||||
document.querySelector(
|
document.querySelector(".ryd-tooltip").style.width = widthPx + "px";
|
||||||
".ryd-tooltip"
|
|
||||||
).style.width = widthPx + "px";
|
|
||||||
document.getElementById("return-youtube-dislike-bar").style.width =
|
document.getElementById("return-youtube-dislike-bar").style.width =
|
||||||
widthPercent + "%";
|
widthPercent + "%";
|
||||||
|
|
||||||
if (extConfig.coloredBar) {
|
if (extConfig.coloredBar) {
|
||||||
document.getElementById(
|
document.getElementById(
|
||||||
"return-youtube-dislike-bar-container"
|
"return-youtube-dislike-bar-container",
|
||||||
).style.backgroundColor = getColorFromTheme(false);
|
).style.backgroundColor = getColorFromTheme(false);
|
||||||
document.getElementById(
|
document.getElementById(
|
||||||
"return-youtube-dislike-bar"
|
"return-youtube-dislike-bar",
|
||||||
).style.backgroundColor = getColorFromTheme(true);
|
).style.backgroundColor = getColorFromTheme(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -426,7 +440,7 @@ function setState() {
|
|||||||
let statsSet = false;
|
let statsSet = false;
|
||||||
|
|
||||||
fetch(
|
fetch(
|
||||||
`https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}`
|
`https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}`,
|
||||||
).then((response) => {
|
).then((response) => {
|
||||||
response.json().then((json) => {
|
response.json().then((json) => {
|
||||||
if (json && !("traceId" in response) && !statsSet) {
|
if (json && !("traceId" in response) && !statsSet) {
|
||||||
@@ -447,24 +461,26 @@ function setState() {
|
|||||||
if (isShorts()) {
|
if (isShorts()) {
|
||||||
// for shorts, leave deactived buttons in default color
|
// for shorts, leave deactived buttons in default color
|
||||||
const shortLikeButton = getLikeButton().querySelector(
|
const shortLikeButton = getLikeButton().querySelector(
|
||||||
"tp-yt-paper-button#button"
|
"tp-yt-paper-button#button",
|
||||||
);
|
);
|
||||||
const shortDislikeButton = dislikeButton?.querySelector(
|
const shortDislikeButton = dislikeButton?.querySelector(
|
||||||
"tp-yt-paper-button#button"
|
"tp-yt-paper-button#button",
|
||||||
);
|
);
|
||||||
if (shortLikeButton.getAttribute("aria-pressed") === "true") {
|
if (shortLikeButton.getAttribute("aria-pressed") === "true") {
|
||||||
shortLikeButton.style.color = getColorFromTheme(true);
|
shortLikeButton.style.color = getColorFromTheme(true);
|
||||||
}
|
}
|
||||||
if (shortDislikeButton &&
|
if (
|
||||||
shortDislikeButton.getAttribute("aria-pressed") === "true")
|
shortDislikeButton &&
|
||||||
{
|
shortDislikeButton.getAttribute("aria-pressed") === "true"
|
||||||
|
) {
|
||||||
shortDislikeButton.style.color = getColorFromTheme(false);
|
shortDislikeButton.style.color = getColorFromTheme(false);
|
||||||
}
|
}
|
||||||
shortsObserver.observe(shortLikeButton);
|
shortsObserver.observe(shortLikeButton);
|
||||||
shortsObserver.observe(shortDislikeButton);
|
shortsObserver.observe(shortDislikeButton);
|
||||||
} else {
|
} else {
|
||||||
getLikeButton().style.color = getColorFromTheme(true);
|
getLikeButton().style.color = getColorFromTheme(true);
|
||||||
if (dislikeButton) dislikeButton.style.color = getColorFromTheme(false);
|
if (dislikeButton)
|
||||||
|
dislikeButton.style.color = getColorFromTheme(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -571,7 +587,7 @@ function numberFormat(numberState) {
|
|||||||
numberDisplay = roundDown(numberState);
|
numberDisplay = roundDown(numberState);
|
||||||
}
|
}
|
||||||
return getNumberFormatter(extConfig.numberDisplayFormat).format(
|
return getNumberFormatter(extConfig.numberDisplayFormat).format(
|
||||||
numberDisplay
|
numberDisplay,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,11 +602,11 @@ function getNumberFormatter(optionSelect) {
|
|||||||
userLocales = new URL(
|
userLocales = new URL(
|
||||||
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
||||||
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
||||||
?.getAttribute("href")
|
?.getAttribute("href"),
|
||||||
)?.searchParams?.get("locale");
|
)?.searchParams?.get("locale");
|
||||||
} catch {
|
} catch {
|
||||||
cLog(
|
cLog(
|
||||||
"Cannot find browser locale. Use en as default for number formatting."
|
"Cannot find browser locale. Use en as default for number formatting.",
|
||||||
);
|
);
|
||||||
userLocales = "en";
|
userLocales = "en";
|
||||||
}
|
}
|
||||||
@@ -671,17 +687,22 @@ function setEventListeners(evt) {
|
|||||||
preNavigateLikeButton = getLikeButton();
|
preNavigateLikeButton = getLikeButton();
|
||||||
|
|
||||||
if (!smartimationObserver) {
|
if (!smartimationObserver) {
|
||||||
smartimationObserver = createObserver({
|
smartimationObserver = createObserver(
|
||||||
attributes: true,
|
{
|
||||||
subtree: true
|
attributes: true,
|
||||||
}, updateDOMDislikes);
|
subtree: true,
|
||||||
|
},
|
||||||
|
updateDOMDislikes,
|
||||||
|
);
|
||||||
smartimationObserver.container = null;
|
smartimationObserver.container = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const smartimationContainer = buttons.querySelector('yt-smartimation');
|
const smartimationContainer =
|
||||||
if (smartimationContainer &&
|
buttons.querySelector("yt-smartimation");
|
||||||
smartimationObserver.container != smartimationContainer)
|
if (
|
||||||
{
|
smartimationContainer &&
|
||||||
|
smartimationObserver.container != smartimationContainer
|
||||||
|
) {
|
||||||
cLog("Initializing smartimation mutation observer");
|
cLog("Initializing smartimation mutation observer");
|
||||||
smartimationObserver.disconnect();
|
smartimationObserver.disconnect();
|
||||||
smartimationObserver.observe(smartimationContainer);
|
smartimationObserver.observe(smartimationContainer);
|
||||||
@@ -716,12 +737,12 @@ if (isMobile) {
|
|||||||
};
|
};
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
const dislikeButton = getDislikeButton();
|
const dislikeButton = getDislikeButton();
|
||||||
if(dislikeButton?.querySelector(".button-renderer-text") === null){
|
if (dislikeButton?.querySelector(".button-renderer-text") === null) {
|
||||||
getDislikeTextContainer().innerText = mobileDislikes;
|
getDislikeTextContainer().innerText = mobileDislikes;
|
||||||
}
|
} else {
|
||||||
else{
|
if (dislikeButton)
|
||||||
if (dislikeButton) dislikeButton.querySelector(".button-renderer-text").innerText =
|
dislikeButton.querySelector(".button-renderer-text").innerText =
|
||||||
mobileDislikes;
|
mobileDislikes;
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,134 +1,134 @@
|
|||||||
{
|
{
|
||||||
"extensionName": {
|
"extensionName": {
|
||||||
"message": "Return YouTube Dislike"
|
"message": "Return YouTube Dislike"
|
||||||
},
|
},
|
||||||
"extensionNameBeta": {
|
"extensionNameBeta": {
|
||||||
"message": "Return YouTube Dislike Beta"
|
"message": "Return YouTube Dislike Beta"
|
||||||
},
|
},
|
||||||
"extensionDesc": {
|
"extensionDesc": {
|
||||||
"message": "Retourneert het vermogen om dislikes te zien"
|
"message": "Retourneert het vermogen om dislikes te zien"
|
||||||
},
|
},
|
||||||
"textDeveloper": {
|
"textDeveloper": {
|
||||||
"message": "door Dmitry Selivanov & Gemeenschap"
|
"message": "door Dmitry Selivanov & Gemeenschap"
|
||||||
},
|
},
|
||||||
"linkWebsite": {
|
"linkWebsite": {
|
||||||
"message": "Website"
|
"message": "Website"
|
||||||
},
|
},
|
||||||
"linkFAQ": {
|
"linkFAQ": {
|
||||||
"message": "FAQ"
|
"message": "FAQ"
|
||||||
},
|
},
|
||||||
"linkDonate": {
|
"linkDonate": {
|
||||||
"message": "Doneer"
|
"message": "Doneer"
|
||||||
},
|
},
|
||||||
"linkHelp": {
|
"linkHelp": {
|
||||||
"message": "Help"
|
"message": "Help"
|
||||||
},
|
},
|
||||||
"linkChangelog": {
|
"linkChangelog": {
|
||||||
"message": "Wijzig-log"
|
"message": "Wijzig-log"
|
||||||
},
|
},
|
||||||
"legendSettings": {
|
"legendSettings": {
|
||||||
"message": "Instellingen"
|
"message": "Instellingen"
|
||||||
},
|
},
|
||||||
"textSettings": {
|
"textSettings": {
|
||||||
"message": "Inzending voor leuk/niet leuk uitschakelen"
|
"message": "Inzending voor leuk/niet leuk uitschakelen"
|
||||||
},
|
},
|
||||||
"textLikesDisabled": {
|
"textLikesDisabled": {
|
||||||
"message": "Uitgeschakeld door eigenaar"
|
"message": "Uitgeschakeld door eigenaar"
|
||||||
},
|
},
|
||||||
"textSettingsHover": {
|
"textSettingsHover": {
|
||||||
"message": "Stopt met het tellen van je leuks en niet leuks"
|
"message": "Stopt met het tellen van je leuks en niet leuks"
|
||||||
},
|
},
|
||||||
"textRoundingNumbers": {
|
"textRoundingNumbers": {
|
||||||
"message": "Statistieken voor leuk/niet leuk naar beneden afronden (standaard YouTube-gedrag)"
|
"message": "Statistieken voor leuk/niet leuk naar beneden afronden (standaard YouTube-gedrag)"
|
||||||
},
|
},
|
||||||
"textRoundingNumbersHover": {
|
"textRoundingNumbersHover": {
|
||||||
"message": "Afgeronde statistieken weergeven."
|
"message": "Afgeronde statistieken weergeven."
|
||||||
},
|
},
|
||||||
"textConsistentFormat": {
|
"textConsistentFormat": {
|
||||||
"message": "Maak het formaat voor likes en dislikes consistent"
|
"message": "Maak het formaat voor likes en dislikes consistent"
|
||||||
},
|
},
|
||||||
"textConsistentFormatHover": {
|
"textConsistentFormatHover": {
|
||||||
"message": "Herformatteer als getallen."
|
"message": "Herformatteer als getallen."
|
||||||
},
|
},
|
||||||
"textNumberFormat": {
|
"textNumberFormat": {
|
||||||
"message": "Nummer formaat:"
|
"message": "Nummer formaat:"
|
||||||
},
|
},
|
||||||
"textColorizeRatioBar": {
|
"textColorizeRatioBar": {
|
||||||
"message": "Verhoudingsbalk inkleuren"
|
"message": "Verhoudingsbalk inkleuren"
|
||||||
},
|
},
|
||||||
"textColorizeRatioBarHover": {
|
"textColorizeRatioBarHover": {
|
||||||
"message": "Gebruik aangepaste kleuren voor de verhoudingsbalk."
|
"message": "Gebruik aangepaste kleuren voor de verhoudingsbalk."
|
||||||
},
|
},
|
||||||
"textColorizeThumbs": {
|
"textColorizeThumbs": {
|
||||||
"message": "Duimen inkleuren"
|
"message": "Duimen inkleuren"
|
||||||
},
|
},
|
||||||
"textColorizeThumbsHover": {
|
"textColorizeThumbsHover": {
|
||||||
"message": "Gebruik aangepaste kleuren voor duimpictogrammen."
|
"message": "Gebruik aangepaste kleuren voor duimpictogrammen."
|
||||||
},
|
},
|
||||||
"textColorTheme": {
|
"textColorTheme": {
|
||||||
"message": "Kleuren thema:"
|
"message": "Kleuren thema:"
|
||||||
},
|
},
|
||||||
"textColorTheme1": {
|
"textColorTheme1": {
|
||||||
"message": "Klassiek"
|
"message": "Klassiek"
|
||||||
},
|
},
|
||||||
"textColorTheme2": {
|
"textColorTheme2": {
|
||||||
"message": "Beschikbaar"
|
"message": "Beschikbaar"
|
||||||
},
|
},
|
||||||
"textColorTheme3": {
|
"textColorTheme3": {
|
||||||
"message": "Neon"
|
"message": "Neon"
|
||||||
},
|
},
|
||||||
"textTempUnavailable": {
|
"textTempUnavailable": {
|
||||||
"message": "Tijdelijk niet beschikbaar"
|
"message": "Tijdelijk niet beschikbaar"
|
||||||
},
|
},
|
||||||
"textUpdate": {
|
"textUpdate": {
|
||||||
"message": "Update naar"
|
"message": "Update naar"
|
||||||
},
|
},
|
||||||
"version30installed": {
|
"version30installed": {
|
||||||
"message": "Versie 3.0.0.13 geïnstalleerd"
|
"message": "Versie 3.0.0.13 geïnstalleerd"
|
||||||
},
|
},
|
||||||
"whatsnew": {
|
"whatsnew": {
|
||||||
"message": "Wat is er nieuw"
|
"message": "Wat is er nieuw"
|
||||||
},
|
},
|
||||||
"shortsSupport": {
|
"shortsSupport": {
|
||||||
"message": "YouTube Shorts Ondersteuning"
|
"message": "YouTube Shorts Ondersteuning"
|
||||||
},
|
},
|
||||||
"customColors": {
|
"customColors": {
|
||||||
"message": "Aangepaste kleuren voor afkeerbalk en knoppen"
|
"message": "Aangepaste kleuren voor afkeerbalk en knoppen"
|
||||||
},
|
},
|
||||||
"customNumberFormats": {
|
"customNumberFormats": {
|
||||||
"message": "Aangepaste getalnotaties"
|
"message": "Aangepaste getalnotaties"
|
||||||
},
|
},
|
||||||
"considerDonating": {
|
"considerDonating": {
|
||||||
"message": "Het enige dat de extensie draaiende houdt, zijn uw donaties, overweeg alstublieft om het project te steunen."
|
"message": "Het enige dat de extensie draaiende houdt, zijn uw donaties, overweeg alstublieft om het project te steunen."
|
||||||
},
|
},
|
||||||
"roundNumbers": {
|
"roundNumbers": {
|
||||||
"message": "Afgeronde getallen weergeven"
|
"message": "Afgeronde getallen weergeven"
|
||||||
},
|
},
|
||||||
"roundNumbersHover": {
|
"roundNumbersHover": {
|
||||||
"message": "Rond getallen naar beneden af (standaard YouTube-gedrag)."
|
"message": "Rond getallen naar beneden af (standaard YouTube-gedrag)."
|
||||||
},
|
},
|
||||||
"reformatLikes": {
|
"reformatLikes": {
|
||||||
"message": "Opnieuw formatteren zoals getallen"
|
"message": "Opnieuw formatteren zoals getallen"
|
||||||
},
|
},
|
||||||
"reformatLikesHover": {
|
"reformatLikesHover": {
|
||||||
"message": "Maak het formaat voor leuk en niet leuk consistent."
|
"message": "Maak het formaat voor leuk en niet leuk consistent."
|
||||||
},
|
},
|
||||||
"numberFormat": {
|
"numberFormat": {
|
||||||
"message": "Nummer formaat:"
|
"message": "Nummer formaat:"
|
||||||
},
|
},
|
||||||
"colorizeRatio": {
|
"colorizeRatio": {
|
||||||
"message": "Verhoudingsbalk inkleuren"
|
"message": "Verhoudingsbalk inkleuren"
|
||||||
},
|
},
|
||||||
"colorizeRatioHover": {
|
"colorizeRatioHover": {
|
||||||
"message": "Gebruik aangepaste kleuren voor de verhoudingsbalk."
|
"message": "Gebruik aangepaste kleuren voor de verhoudingsbalk."
|
||||||
},
|
},
|
||||||
"colorizeThumbs": {
|
"colorizeThumbs": {
|
||||||
"message": "Duimen inkleuren"
|
"message": "Duimen inkleuren"
|
||||||
},
|
},
|
||||||
"colorizeThumbsHover": {
|
"colorizeThumbsHover": {
|
||||||
"message": "Gebruik aangepaste kleuren voor de duimpictogrammen."
|
"message": "Gebruik aangepaste kleuren voor de duimpictogrammen."
|
||||||
},
|
},
|
||||||
"colorTheme": {
|
"colorTheme": {
|
||||||
"message": "Kleuren thema:"
|
"message": "Kleuren thema:"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta content="text/html; charset=utf-8" />
|
<meta content="text/html; charset=utf-8" />
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "__MSG_extensionName__",
|
"name": "__MSG_extensionName__",
|
||||||
"description": "__MSG_extensionDesc__",
|
"description": "__MSG_extensionDesc__",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"version": "3.0.0.12",
|
"version": "3.0.0.14",
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"background": {
|
"background": {
|
||||||
"service_worker": "ryd.background.js"
|
"service_worker": "ryd.background.js"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "__MSG_extensionName__",
|
"name": "__MSG_extensionName__",
|
||||||
"description": "__MSG_extensionDesc__",
|
"description": "__MSG_extensionDesc__",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"version": "3.0.0.12",
|
"version": "3.0.0.14",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"background": {
|
"background": {
|
||||||
"scripts": ["ryd.background.js"]
|
"scripts": ["ryd.background.js"]
|
||||||
@@ -34,10 +34,10 @@
|
|||||||
"open_in_tab": false
|
"open_in_tab": false
|
||||||
}
|
}
|
||||||
// uncomment this section for local storage to work in firefox locally
|
// uncomment this section for local storage to work in firefox locally
|
||||||
// "browser_specific_settings": {
|
// ,"browser_specific_settings": {
|
||||||
// "gecko": {
|
// "gecko": {
|
||||||
// "id": "addon@example.com",
|
// "id": "addon@example.com",
|
||||||
// "strict_min_version": "42.0"
|
// "strict_min_version": "42.0"
|
||||||
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,9 @@ button:hover {
|
|||||||
content: attr(data-hover);
|
content: attr(data-hover);
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: visibility 0.1s linear, opacity 0.1s linear;
|
transition:
|
||||||
|
visibility 0.1s linear,
|
||||||
|
opacity 0.1s linear;
|
||||||
width: 250px;
|
width: 250px;
|
||||||
background-color: var(--secondary);
|
background-color: var(--secondary);
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta content="text/html; charset=utf-8" />
|
<meta content="text/html; charset=utf-8" />
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ document.getElementById("color_theme").addEventListener("click", (ev) => {
|
|||||||
chrome.storage.sync.set({ colorTheme: ev.target.value });
|
chrome.storage.sync.set({ colorTheme: ev.target.value });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
document.getElementById("number_format").addEventListener("change", (ev) => {
|
document.getElementById("number_format").addEventListener("change", (ev) => {
|
||||||
chrome.storage.sync.set({ numberDisplayFormat: ev.target.value });
|
chrome.storage.sync.set({ numberDisplayFormat: ev.target.value });
|
||||||
});
|
});
|
||||||
@@ -140,7 +139,7 @@ function initializeVersionNumber() {
|
|||||||
document.getElementById("ext-version").innerHTML = "v" + version;
|
document.getElementById("ext-version").innerHTML = "v" + version;
|
||||||
|
|
||||||
fetch(
|
fetch(
|
||||||
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json"
|
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json",
|
||||||
)
|
)
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
.then((json) => {
|
.then((json) => {
|
||||||
@@ -197,7 +196,6 @@ function initializeColorTheme() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function initializeTooltipPercentage() {
|
function initializeTooltipPercentage() {
|
||||||
chrome.storage.sync.get(["showTooltipPercentage"], (res) => {
|
chrome.storage.sync.get(["showTooltipPercentage"], (res) => {
|
||||||
handleShowTooltipPercentageChangeEvent(res.showTooltipPercentage);
|
handleShowTooltipPercentageChangeEvent(res.showTooltipPercentage);
|
||||||
@@ -238,7 +236,7 @@ chrome.storage.onChanged.addListener(storageChangeHandler);
|
|||||||
function storageChangeHandler(changes, area) {
|
function storageChangeHandler(changes, area) {
|
||||||
if (changes.disableVoteSubmission !== undefined) {
|
if (changes.disableVoteSubmission !== undefined) {
|
||||||
handleDisableVoteSubmissionChangeEvent(
|
handleDisableVoteSubmissionChangeEvent(
|
||||||
changes.disableVoteSubmission.newValue
|
changes.disableVoteSubmission.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (changes.coloredThumbs !== undefined) {
|
if (changes.coloredThumbs !== undefined) {
|
||||||
@@ -255,12 +253,12 @@ function storageChangeHandler(changes, area) {
|
|||||||
}
|
}
|
||||||
if (changes.showTooltipPercentage !== undefined) {
|
if (changes.showTooltipPercentage !== undefined) {
|
||||||
handleShowTooltipPercentageChangeEvent(
|
handleShowTooltipPercentageChangeEvent(
|
||||||
changes.showTooltipPercentage.newValue
|
changes.showTooltipPercentage.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||||
handleNumberDisplayReformatLikesChangeEvent(
|
handleNumberDisplayReformatLikesChangeEvent(
|
||||||
changes.numberDisplayReformatLikes.newValue
|
changes.numberDisplayReformatLikes.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -298,8 +296,6 @@ function updateColorThemePreviewContent(themeName) {
|
|||||||
getColorFromTheme(themeName, false);
|
getColorFromTheme(themeName, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function handleNumberDisplayFormatChangeEvent(value) {
|
function handleNumberDisplayFormatChangeEvent(value) {
|
||||||
config.numberDisplayFormat = value;
|
config.numberDisplayFormat = value;
|
||||||
document
|
document
|
||||||
@@ -336,7 +332,7 @@ function getNumberFormatter(optionSelect) {
|
|||||||
userLocales = new URL(
|
userLocales = new URL(
|
||||||
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
||||||
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
||||||
?.getAttribute("href")
|
?.getAttribute("href"),
|
||||||
)?.searchParams?.get("locale");
|
)?.searchParams?.get("locale");
|
||||||
} catch {}
|
} catch {}
|
||||||
|
|
||||||
@@ -359,7 +355,7 @@ function getNumberFormatter(optionSelect) {
|
|||||||
{
|
{
|
||||||
notation: formatterNotation,
|
notation: formatterNotation,
|
||||||
compactDisplay: formatterCompactDisplay,
|
compactDisplay: formatterCompactDisplay,
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
return formatter;
|
return formatter;
|
||||||
}
|
}
|
||||||
@@ -368,7 +364,7 @@ function getNumberFormatter(optionSelect) {
|
|||||||
let status = document.getElementById("status");
|
let status = document.getElementById("status");
|
||||||
let serverStatus = document.getElementById("server-status");
|
let serverStatus = document.getElementById("server-status");
|
||||||
let resp = await fetch(
|
let resp = await fetch(
|
||||||
"https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g"
|
"https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g",
|
||||||
);
|
);
|
||||||
let result = await resp.status;
|
let result = await resp.status;
|
||||||
if (result === 200) {
|
if (result === 200) {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ api.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
|||||||
headers: {
|
headers: {
|
||||||
Accept: "application/json",
|
Accept: "application/json",
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
@@ -153,7 +153,7 @@ async function register() {
|
|||||||
headers: {
|
headers: {
|
||||||
Accept: "application/json",
|
Accept: "application/json",
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
).then((response) => response.json());
|
).then((response) => response.json());
|
||||||
const solvedPuzzle = await solvePuzzle(registrationResponse);
|
const solvedPuzzle = await solvePuzzle(registrationResponse);
|
||||||
if (!solvedPuzzle.solution) {
|
if (!solvedPuzzle.solution) {
|
||||||
@@ -210,7 +210,7 @@ function countLeadingZeroes(uInt8View, limit) {
|
|||||||
|
|
||||||
async function solvePuzzle(puzzle) {
|
async function solvePuzzle(puzzle) {
|
||||||
let challenge = Uint8Array.from(atob(puzzle.challenge), (c) =>
|
let challenge = Uint8Array.from(atob(puzzle.challenge), (c) =>
|
||||||
c.charCodeAt(0)
|
c.charCodeAt(0),
|
||||||
);
|
);
|
||||||
let buffer = new ArrayBuffer(20);
|
let buffer = new ArrayBuffer(20);
|
||||||
let uInt8View = new Uint8Array(buffer);
|
let uInt8View = new Uint8Array(buffer);
|
||||||
@@ -255,7 +255,7 @@ function generateUserID(length = 36) {
|
|||||||
function storageChangeHandler(changes, area) {
|
function storageChangeHandler(changes, area) {
|
||||||
if (changes.disableVoteSubmission !== undefined) {
|
if (changes.disableVoteSubmission !== undefined) {
|
||||||
handleDisableVoteSubmissionChangeEvent(
|
handleDisableVoteSubmissionChangeEvent(
|
||||||
changes.disableVoteSubmission.newValue
|
changes.disableVoteSubmission.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (changes.coloredThumbs !== undefined) {
|
if (changes.coloredThumbs !== undefined) {
|
||||||
@@ -272,17 +272,17 @@ function storageChangeHandler(changes, area) {
|
|||||||
}
|
}
|
||||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||||
handleNumberDisplayReformatLikesChangeEvent(
|
handleNumberDisplayReformatLikesChangeEvent(
|
||||||
changes.numberDisplayReformatLikes.newValue
|
changes.numberDisplayReformatLikes.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (changes.showTooltipPercentage !== undefined) {
|
if (changes.showTooltipPercentage !== undefined) {
|
||||||
handleShowTooltipPercentageChangeEvent(
|
handleShowTooltipPercentageChangeEvent(
|
||||||
changes.showTooltipPercentage.newValue
|
changes.showTooltipPercentage.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||||
handleNumberDisplayReformatLikesChangeEvent(
|
handleNumberDisplayReformatLikesChangeEvent(
|
||||||
changes.numberDisplayReformatLikes.newValue
|
changes.numberDisplayReformatLikes.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,11 @@
|
|||||||
//--- Import Button Functions ---//
|
//--- Import Button Functions ---//
|
||||||
import {
|
import { getButtons } from "./src/buttons";
|
||||||
getButtons,
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} from "./src/buttons";
|
|
||||||
|
|
||||||
//--- Import State Functions ---//
|
//--- Import State Functions ---//
|
||||||
import {
|
import { isShorts, setInitialState, initExtConfig } from "./src/state";
|
||||||
isShorts,
|
|
||||||
setInitialState,
|
|
||||||
initExtConfig,
|
|
||||||
} from "./src/state";
|
|
||||||
|
|
||||||
//--- Import Video & Browser Functions ---//
|
//--- Import Video & Browser Functions ---//
|
||||||
import {
|
import { getBrowser, isVideoLoaded, cLog } from "./src/utils";
|
||||||
getBrowser,
|
|
||||||
isVideoLoaded,
|
|
||||||
cLog,
|
|
||||||
} from "./src/utils";
|
|
||||||
import {
|
import {
|
||||||
addLikeDislikeEventListener,
|
addLikeDislikeEventListener,
|
||||||
createSmartimationObserver,
|
createSmartimationObserver,
|
||||||
@@ -30,8 +17,8 @@ await initExtConfig();
|
|||||||
let jsInitChecktimer = null;
|
let jsInitChecktimer = null;
|
||||||
let isSetInitialStateDone = false;
|
let isSetInitialStateDone = false;
|
||||||
|
|
||||||
async function setEventListeners (evt) {
|
async function setEventListeners(evt) {
|
||||||
async function checkForJS_Finish () {
|
async function checkForJS_Finish() {
|
||||||
try {
|
try {
|
||||||
if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) {
|
if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) {
|
||||||
clearInterval(jsInitChecktimer);
|
clearInterval(jsInitChecktimer);
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ function createRateBar(likes, dislikes) {
|
|||||||
|
|
||||||
if (!isShorts()) {
|
if (!isShorts()) {
|
||||||
if (!rateBar && !isMobile()) {
|
if (!rateBar && !isMobile()) {
|
||||||
let colorLikeStyle = " ";
|
let colorLikeStyle = "";
|
||||||
let colorDislikeStyle = "";
|
let colorDislikeStyle = "";
|
||||||
if (extConfig.coloredBar) {
|
if (extConfig.coloredBar) {
|
||||||
colorLikeStyle = "; background-color: " + getColorFromTheme(true);
|
colorLikeStyle = "; background-color: " + getColorFromTheme(true);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { isMobile, isShorts, extConfig } from "./state";
|
import { isMobile, isShorts, extConfig } from "./state";
|
||||||
import { isInViewport, querySelector, querySelectorAll } from './utils';
|
import { isInViewport, querySelector, querySelectorAll } from "./utils";
|
||||||
|
|
||||||
function getButtons() {
|
function getButtons() {
|
||||||
//--- If Watching Youtube Shorts: ---//
|
//--- If Watching Youtube Shorts: ---//
|
||||||
@@ -22,7 +22,7 @@ function getButtons() {
|
|||||||
}
|
}
|
||||||
//--- If Menu Element Is Displayed: ---//
|
//--- If Menu Element Is Displayed: ---//
|
||||||
if (querySelector(extConfig.selectors.menuContainer)?.offsetParent === null) {
|
if (querySelector(extConfig.selectors.menuContainer)?.offsetParent === null) {
|
||||||
return querySelector(extConfig.selectors.buttons.regular.desktopMenu)
|
return querySelector(extConfig.selectors.buttons.regular.desktopMenu);
|
||||||
//--- If Menu Element Isn't Displayed: ---//
|
//--- If Menu Element Isn't Displayed: ---//
|
||||||
} else {
|
} else {
|
||||||
return querySelector(extConfig.selectors.buttons.regular.desktopNoMenu);
|
return querySelector(extConfig.selectors.buttons.regular.desktopNoMenu);
|
||||||
@@ -31,9 +31,16 @@ function getButtons() {
|
|||||||
|
|
||||||
function getLikeButton() {
|
function getLikeButton() {
|
||||||
return getButtons().children[0].tagName ===
|
return getButtons().children[0].tagName ===
|
||||||
'YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER'
|
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||||
? querySelector(extConfig.selectors.buttons.likeButton.segmented) ?? querySelector(extConfig.selectors.buttons.likeButton.segmentedGetButtons, getButtons())
|
? querySelector(extConfig.selectors.buttons.likeButton.segmented) ??
|
||||||
: querySelector(extConfig.selectors.buttons.likeButton.notSegmented, getButtons())
|
querySelector(
|
||||||
|
extConfig.selectors.buttons.likeButton.segmentedGetButtons,
|
||||||
|
getButtons(),
|
||||||
|
)
|
||||||
|
: querySelector(
|
||||||
|
extConfig.selectors.buttons.likeButton.notSegmented,
|
||||||
|
getButtons(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLikeTextContainer() {
|
function getLikeTextContainer() {
|
||||||
@@ -42,21 +49,45 @@ function getLikeTextContainer() {
|
|||||||
|
|
||||||
function getDislikeButton() {
|
function getDislikeButton() {
|
||||||
return getButtons().children[0].tagName ===
|
return getButtons().children[0].tagName ===
|
||||||
'YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER'
|
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||||
? querySelector(extConfig.selectors.buttons.dislikeButton.segmented) ?? querySelector(extConfig.selectors.buttons.dislikeButton.segmentedGetButtons, getButtons())
|
? querySelector(extConfig.selectors.buttons.dislikeButton.segmented) ??
|
||||||
: isShorts() ? querySelector(['#dislike-button'], getButtons()) : querySelector(extConfig.selectors.buttons.dislikeButton.notSegmented, getButtons())
|
querySelector(
|
||||||
|
extConfig.selectors.buttons.dislikeButton.segmentedGetButtons,
|
||||||
|
getButtons(),
|
||||||
|
)
|
||||||
|
: isShorts()
|
||||||
|
? querySelector(["#dislike-button"], getButtons())
|
||||||
|
: querySelector(
|
||||||
|
extConfig.selectors.buttons.dislikeButton.notSegmented,
|
||||||
|
getButtons(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createDislikeTextContainer() {
|
function createDislikeTextContainer() {
|
||||||
const textNodeClone = (getLikeButton().querySelector('.yt-spec-button-shape-next__button-text-content') || (getLikeButton().querySelector("button > div[class*='cbox']") || (getLikeButton().querySelector('div > span[role="text"]') || document.querySelector('button > div.yt-spec-button-shape-next__button-text-content > span[role="text"]')).parentNode)).cloneNode(true);
|
const textNodeClone = (
|
||||||
|
getLikeButton().querySelector(
|
||||||
|
".yt-spec-button-shape-next__button-text-content",
|
||||||
|
) ||
|
||||||
|
getLikeButton().querySelector("button > div[class*='cbox']") ||
|
||||||
|
(
|
||||||
|
getLikeButton().querySelector('div > span[role="text"]') ||
|
||||||
|
document.querySelector(
|
||||||
|
'button > div.yt-spec-button-shape-next__button-text-content > span[role="text"]',
|
||||||
|
)
|
||||||
|
).parentNode
|
||||||
|
).cloneNode(true);
|
||||||
const insertPreChild = getDislikeButton().querySelector("button");
|
const insertPreChild = getDislikeButton().querySelector("button");
|
||||||
insertPreChild.insertBefore(textNodeClone, null);
|
insertPreChild.insertBefore(textNodeClone, null);
|
||||||
getDislikeButton().querySelector("button").classList.remove("yt-spec-button-shape-next--icon-button");
|
getDislikeButton()
|
||||||
getDislikeButton().querySelector("button").classList.add("yt-spec-button-shape-next--icon-leading");
|
.querySelector("button")
|
||||||
if(textNodeClone.querySelector("span[role='text']") === null) {
|
.classList.remove("yt-spec-button-shape-next--icon-button");
|
||||||
|
getDislikeButton()
|
||||||
|
.querySelector("button")
|
||||||
|
.classList.add("yt-spec-button-shape-next--icon-leading");
|
||||||
|
if (textNodeClone.querySelector("span[role='text']") === null) {
|
||||||
const span = document.createElement("span");
|
const span = document.createElement("span");
|
||||||
span.setAttribute("role", "text");
|
span.setAttribute("role", "text");
|
||||||
while(textNodeClone.firstChild){
|
while (textNodeClone.firstChild) {
|
||||||
textNodeClone.removeChild(textNodeClone.firstChild);
|
textNodeClone.removeChild(textNodeClone.firstChild);
|
||||||
}
|
}
|
||||||
textNodeClone.appendChild(span);
|
textNodeClone.appendChild(span);
|
||||||
@@ -82,7 +113,7 @@ function getDislikeTextContainer() {
|
|||||||
function checkForSignInButton() {
|
function checkForSignInButton() {
|
||||||
if (
|
if (
|
||||||
document.querySelector(
|
document.querySelector(
|
||||||
"a[href^='https://accounts.google.com/ServiceLogin']"
|
"a[href^='https://accounts.google.com/ServiceLogin']",
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
import { getBrowser, getVideoId, numberFormat, cLog, createObserver } from "./utils";
|
import {
|
||||||
import { checkForSignInButton, getButtons, getDislikeButton, getLikeButton } from './buttons';
|
getBrowser,
|
||||||
|
getVideoId,
|
||||||
|
numberFormat,
|
||||||
|
cLog,
|
||||||
|
createObserver,
|
||||||
|
} from "./utils";
|
||||||
|
import {
|
||||||
|
checkForSignInButton,
|
||||||
|
getButtons,
|
||||||
|
getDislikeButton,
|
||||||
|
getLikeButton,
|
||||||
|
} from "./buttons";
|
||||||
import {
|
import {
|
||||||
NEUTRAL_STATE,
|
NEUTRAL_STATE,
|
||||||
LIKED_STATE,
|
LIKED_STATE,
|
||||||
@@ -101,15 +112,21 @@ let smartimationObserver = null;
|
|||||||
|
|
||||||
function createSmartimationObserver() {
|
function createSmartimationObserver() {
|
||||||
if (!smartimationObserver) {
|
if (!smartimationObserver) {
|
||||||
smartimationObserver = createObserver({
|
smartimationObserver = createObserver(
|
||||||
attributes: true,
|
{
|
||||||
subtree: true
|
attributes: true,
|
||||||
}, updateDOMDislikes);
|
subtree: true,
|
||||||
|
},
|
||||||
|
updateDOMDislikes,
|
||||||
|
);
|
||||||
smartimationObserver.container = null;
|
smartimationObserver.container = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const smartimationContainer = getButtons().querySelector('yt-smartimation');
|
const smartimationContainer = getButtons().querySelector("yt-smartimation");
|
||||||
if (smartimationContainer && smartimationObserver.container != smartimationContainer) {
|
if (
|
||||||
|
smartimationContainer &&
|
||||||
|
smartimationObserver.container != smartimationContainer
|
||||||
|
) {
|
||||||
cLog("Initializing smartimation mutation observer");
|
cLog("Initializing smartimation mutation observer");
|
||||||
smartimationObserver.disconnect();
|
smartimationObserver.disconnect();
|
||||||
smartimationObserver.observe(smartimationContainer);
|
smartimationObserver.observe(smartimationContainer);
|
||||||
@@ -120,7 +137,7 @@ function createSmartimationObserver() {
|
|||||||
function storageChangeHandler(changes, area) {
|
function storageChangeHandler(changes, area) {
|
||||||
if (changes.disableVoteSubmission !== undefined) {
|
if (changes.disableVoteSubmission !== undefined) {
|
||||||
handleDisableVoteSubmissionChangeEvent(
|
handleDisableVoteSubmissionChangeEvent(
|
||||||
changes.disableVoteSubmission.newValue
|
changes.disableVoteSubmission.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (changes.coloredThumbs !== undefined) {
|
if (changes.coloredThumbs !== undefined) {
|
||||||
@@ -137,7 +154,7 @@ function storageChangeHandler(changes, area) {
|
|||||||
}
|
}
|
||||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||||
handleNumberDisplayReformatLikesChangeEvent(
|
handleNumberDisplayReformatLikesChangeEvent(
|
||||||
changes.numberDisplayReformatLikes.newValue
|
changes.numberDisplayReformatLikes.newValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ function createStarRating(rating, isMobile) {
|
|||||||
starSlider.setAttribute("readonly", "");
|
starSlider.setAttribute("readonly", "");
|
||||||
starSlider.setAttribute(
|
starSlider.setAttribute(
|
||||||
"style",
|
"style",
|
||||||
`--fill:rgb(255, 215, 0);--value:${rating.toString()};};background-color: transparent;`
|
`--fill:rgb(255, 215, 0);--value:${rating.toString()};};background-color: transparent;`,
|
||||||
);
|
);
|
||||||
starSlider.setAttribute("type", "range");
|
starSlider.setAttribute("type", "range");
|
||||||
|
|
||||||
@@ -19,11 +19,11 @@ function createStarRating(rating, isMobile) {
|
|||||||
|
|
||||||
if (isMobile) {
|
if (isMobile) {
|
||||||
YTLikeButton = document.querySelector(
|
YTLikeButton = document.querySelector(
|
||||||
"#app > div.page-container > ytm-watch > ytm-single-column-watch-next-results-renderer > ytm-slim-video-metadata-section-renderer > ytm-slim-video-action-bar-renderer > div > ytm-slim-metadata-toggle-button-renderer:nth-child(1)"
|
"#app > div.page-container > ytm-watch > ytm-single-column-watch-next-results-renderer > ytm-slim-video-metadata-section-renderer > ytm-slim-video-action-bar-renderer > div > ytm-slim-metadata-toggle-button-renderer:nth-child(1)",
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
YTLikeButton = document.querySelector(
|
YTLikeButton = document.querySelector(
|
||||||
"#top-level-buttons-computed > ytd-toggle-button-renderer:nth-child(1)"
|
"#top-level-buttons-computed > ytd-toggle-button-renderer:nth-child(1)",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,8 @@ import {
|
|||||||
getColorFromTheme,
|
getColorFromTheme,
|
||||||
querySelector,
|
querySelector,
|
||||||
localize,
|
localize,
|
||||||
createObserver
|
createObserver,
|
||||||
} from './utils';
|
} from "./utils";
|
||||||
import { createStarRating } from "./starRating";
|
|
||||||
import { dislikeClicked } from './events';
|
|
||||||
|
|
||||||
//TODO: Do not duplicate here and in ryd.background.js
|
//TODO: Do not duplicate here and in ryd.background.js
|
||||||
const apiUrl = "https://returnyoutubedislikeapi.com";
|
const apiUrl = "https://returnyoutubedislikeapi.com";
|
||||||
@@ -50,17 +48,17 @@ let extConfig = {
|
|||||||
likeButton: {
|
likeButton: {
|
||||||
segmented: [],
|
segmented: [],
|
||||||
segmentedGetButtons: [],
|
segmentedGetButtons: [],
|
||||||
notSegmented: []
|
notSegmented: [],
|
||||||
},
|
},
|
||||||
dislikeButton: {
|
dislikeButton: {
|
||||||
segmented: [],
|
segmented: [],
|
||||||
segmentedGetButtons: [],
|
segmentedGetButtons: [],
|
||||||
notSegmented: []
|
notSegmented: [],
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
menuContainer: [],
|
menuContainer: [],
|
||||||
roundedDesign: [],
|
roundedDesign: [],
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let storedData = {
|
let storedData = {
|
||||||
@@ -89,38 +87,43 @@ let shortsObserver = null;
|
|||||||
|
|
||||||
if (isShorts() && !shortsObserver) {
|
if (isShorts() && !shortsObserver) {
|
||||||
cLog("Initializing shorts mutation observer");
|
cLog("Initializing shorts mutation observer");
|
||||||
shortsObserver = createObserver({
|
shortsObserver = createObserver(
|
||||||
attributes: true
|
{
|
||||||
}, (mutationList) => {
|
attributes: true,
|
||||||
mutationList.forEach((mutation) => {
|
},
|
||||||
if (
|
(mutationList) => {
|
||||||
mutation.type === "attributes" &&
|
mutationList.forEach((mutation) => {
|
||||||
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
if (
|
||||||
mutation.target.id === "button"
|
mutation.type === "attributes" &&
|
||||||
) {
|
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
||||||
// cLog('Short thumb button status changed');
|
mutation.target.id === "button"
|
||||||
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
) {
|
||||||
mutation.target.style.color =
|
// cLog('Short thumb button status changed');
|
||||||
mutation.target.parentElement.parentElement.id === "like-button"
|
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
||||||
? getColorFromTheme(true)
|
mutation.target.style.color =
|
||||||
: getColorFromTheme(false);
|
mutation.target.parentElement.parentElement.id === "like-button"
|
||||||
} else {
|
? getColorFromTheme(true)
|
||||||
mutation.target.style.color = "unset";
|
: getColorFromTheme(false);
|
||||||
|
} else {
|
||||||
|
mutation.target.style.color = "unset";
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
cLog(
|
||||||
}
|
"Unexpected mutation observer event: " +
|
||||||
cLog(
|
mutation.target +
|
||||||
"Unexpected mutation observer event: " + mutation.target + mutation.type
|
mutation.type,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isLikesDisabled() {
|
function isLikesDisabled() {
|
||||||
// return true if the like button's text doesn't contain any number
|
// return true if the like button's text doesn't contain any number
|
||||||
if (isMobile()) {
|
if (isMobile()) {
|
||||||
return /^\D*$/.test(
|
return /^\D*$/.test(
|
||||||
getButtons().children[0].querySelector(".button-renderer-text").innerText
|
getButtons().children[0].querySelector(".button-renderer-text").innerText,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return /^\D*$/.test(getLikeTextContainer().innerText);
|
return /^\D*$/.test(getLikeTextContainer().innerText);
|
||||||
@@ -129,19 +132,29 @@ function isLikesDisabled() {
|
|||||||
function isVideoLiked() {
|
function isVideoLiked() {
|
||||||
if (isMobile()) {
|
if (isMobile()) {
|
||||||
return (
|
return (
|
||||||
getLikeButton().querySelector("button").getAttribute("aria-label") === "true"
|
getLikeButton().querySelector("button").getAttribute("aria-label") ===
|
||||||
|
"true"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return getLikeButton().classList.contains("style-default-active") || getLikeButton().querySelector('button')?.getAttribute('aria-pressed') === 'true';
|
return (
|
||||||
|
getLikeButton().classList.contains("style-default-active") ||
|
||||||
|
getLikeButton().querySelector("button")?.getAttribute("aria-pressed") ===
|
||||||
|
"true"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isVideoDisliked() {
|
function isVideoDisliked() {
|
||||||
if (isMobile()) {
|
if (isMobile()) {
|
||||||
return (
|
return (
|
||||||
getDislikeButton().querySelector("button").getAttribute("aria-label") === "true"
|
getDislikeButton().querySelector("button").getAttribute("aria-label") ===
|
||||||
|
"true"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return getDislikeButton().classList.contains("style-default-active") || getDislikeButton().querySelector('button')?.getAttribute('aria-pressed') === 'true';
|
return (
|
||||||
|
getDislikeButton().classList.contains("style-default-active") ||
|
||||||
|
getDislikeButton().querySelector("button")?.getAttribute("aria-pressed") ===
|
||||||
|
"true"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getState(storedData) {
|
function getState(storedData) {
|
||||||
@@ -156,27 +169,26 @@ function getState(storedData) {
|
|||||||
|
|
||||||
//--- Sets The Likes And Dislikes Values ---//
|
//--- Sets The Likes And Dislikes Values ---//
|
||||||
function setLikes(likesCount) {
|
function setLikes(likesCount) {
|
||||||
cLog(`SET likes ${likesCount}`)
|
cLog(`SET likes ${likesCount}`);
|
||||||
getLikeTextContainer().innerText = likesCount;
|
getLikeTextContainer().innerText = likesCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setDislikes(dislikesCount) {
|
function setDislikes(dislikesCount) {
|
||||||
cLog(`SET dislikes ${dislikesCount}`)
|
cLog(`SET dislikes ${dislikesCount}`);
|
||||||
getDislikeTextContainer()?.removeAttribute("is-empty");
|
getDislikeTextContainer()?.removeAttribute("is-empty");
|
||||||
if (!isLikesDisabled()) {
|
if (!isLikesDisabled()) {
|
||||||
if (isMobile()) {
|
if (isMobile()) {
|
||||||
getButtons().children[1].querySelector(
|
getButtons().children[1].querySelector(
|
||||||
".button-renderer-text"
|
".button-renderer-text",
|
||||||
).innerText = dislikesCount;
|
).innerText = dislikesCount;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
getDislikeTextContainer().innerText = dislikesCount;
|
getDislikeTextContainer().innerText = dislikesCount;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
cLog("likes count disabled by creator");
|
cLog("likes count disabled by creator");
|
||||||
if (isMobile()) {
|
if (isMobile()) {
|
||||||
getButtons().children[1].querySelector(
|
getButtons().children[1].querySelector(
|
||||||
".button-renderer-text"
|
".button-renderer-text",
|
||||||
).innerText = localize("TextLikesDisabled");
|
).innerText = localize("TextLikesDisabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -192,12 +204,11 @@ function getLikeCountFromButton() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let likeButton = getLikeButton()
|
let likeButton =
|
||||||
.querySelector("yt-formatted-string#text") ??
|
getLikeButton().querySelector("yt-formatted-string#text") ??
|
||||||
getLikeButton().querySelector("button");
|
getLikeButton().querySelector("button");
|
||||||
|
|
||||||
let likesStr = likeButton.getAttribute("aria-label")
|
let likesStr = likeButton.getAttribute("aria-label").replace(/\D/g, "");
|
||||||
.replace(/\D/g, "");
|
|
||||||
return likesStr.length > 0 ? parseInt(likesStr) : false;
|
return likesStr.length > 0 ? parseInt(likesStr) : false;
|
||||||
} catch {
|
} catch {
|
||||||
return false;
|
return false;
|
||||||
@@ -220,10 +231,10 @@ function processResponse(response, storedData) {
|
|||||||
if (isShorts()) {
|
if (isShorts()) {
|
||||||
// for shorts, leave deactivated buttons in default color
|
// for shorts, leave deactivated buttons in default color
|
||||||
let shortLikeButton = getLikeButton().querySelector(
|
let shortLikeButton = getLikeButton().querySelector(
|
||||||
"tp-yt-paper-button#button"
|
"tp-yt-paper-button#button",
|
||||||
);
|
);
|
||||||
let shortDislikeButton = getDislikeButton().querySelector(
|
let shortDislikeButton = getDislikeButton().querySelector(
|
||||||
"tp-yt-paper-button#button"
|
"tp-yt-paper-button#button",
|
||||||
);
|
);
|
||||||
if (shortLikeButton.getAttribute("aria-pressed") === "true") {
|
if (shortLikeButton.getAttribute("aria-pressed") === "true") {
|
||||||
shortLikeButton.style.color = getColorFromTheme(true);
|
shortLikeButton.style.color = getColorFromTheme(true);
|
||||||
@@ -244,17 +255,15 @@ function processResponse(response, storedData) {
|
|||||||
|
|
||||||
// Tells the user if the API is down
|
// Tells the user if the API is down
|
||||||
function displayError(error) {
|
function displayError(error) {
|
||||||
getDislikeTextContainer().innerText = localize(
|
getDislikeTextContainer().innerText = localize("textTempUnavailable");
|
||||||
"textTempUnavailable"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setState(storedData) {
|
async function setState(storedData) {
|
||||||
storedData.previousState = isVideoDisliked()
|
storedData.previousState = isVideoDisliked()
|
||||||
? DISLIKED_STATE
|
? DISLIKED_STATE
|
||||||
: isVideoLiked()
|
: isVideoLiked()
|
||||||
? LIKED_STATE
|
? LIKED_STATE
|
||||||
: NEUTRAL_STATE;
|
: NEUTRAL_STATE;
|
||||||
let statsSet = false;
|
let statsSet = false;
|
||||||
cLog("Video is loaded. Adding buttons...");
|
cLog("Video is loaded. Adding buttons...");
|
||||||
|
|
||||||
@@ -268,7 +277,7 @@ async function setState(storedData) {
|
|||||||
headers: {
|
headers: {
|
||||||
Accept: "application/json",
|
Accept: "application/json",
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (!response.ok) displayError(response.error);
|
if (!response.ok) displayError(response.error);
|
||||||
@@ -283,11 +292,11 @@ async function setState(storedData) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setInitialState () {
|
async function setInitialState() {
|
||||||
await setState(storedData);
|
await setState(storedData);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function initExtConfig () {
|
async function initExtConfig() {
|
||||||
initializeDisableVoteSubmission();
|
initializeDisableVoteSubmission();
|
||||||
initializeColoredThumbs();
|
initializeColoredThumbs();
|
||||||
initializeColoredBar();
|
initializeColoredBar();
|
||||||
@@ -299,16 +308,18 @@ async function initExtConfig () {
|
|||||||
await initializeSelectors();
|
await initializeSelectors();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function initializeSelectors () {
|
async function initializeSelectors() {
|
||||||
console.log("initializing selectors")
|
console.log("initializing selectors");
|
||||||
let result = await fetch(`${apiUrl}/configs/selectors`, {
|
let result = await fetch(`${apiUrl}/configs/selectors`, {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: {
|
headers: {
|
||||||
Accept: "application/json",
|
Accept: "application/json",
|
||||||
}
|
},
|
||||||
}).then((response) => response.json()).catch((error) => {});
|
})
|
||||||
|
.then((response) => response.json())
|
||||||
|
.catch((error) => {});
|
||||||
extConfig.selectors = result ?? extConfig.selectors;
|
extConfig.selectors = result ?? extConfig.selectors;
|
||||||
console.log(result)
|
console.log(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
function initializeDisableVoteSubmission() {
|
function initializeDisableVoteSubmission() {
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import { extConfig } from "./state";
|
import { extConfig } from "./state";
|
||||||
|
|
||||||
function numberFormat(numberState) {
|
function numberFormat(numberState) {
|
||||||
return getNumberFormatter(extConfig.numberDisplayFormat).format(
|
return getNumberFormatter(extConfig.numberDisplayFormat).format(numberState);
|
||||||
numberState
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNumberFormatter(optionSelect) {
|
function getNumberFormatter(optionSelect) {
|
||||||
@@ -17,11 +15,11 @@ function getNumberFormatter(optionSelect) {
|
|||||||
userLocales = new URL(
|
userLocales = new URL(
|
||||||
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
||||||
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
||||||
?.getAttribute("href")
|
?.getAttribute("href"),
|
||||||
)?.searchParams?.get("locale");
|
)?.searchParams?.get("locale");
|
||||||
} catch {
|
} catch {
|
||||||
cLog(
|
cLog(
|
||||||
"Cannot find browser locale. Use en as default for number formatting."
|
"Cannot find browser locale. Use en as default for number formatting.",
|
||||||
);
|
);
|
||||||
userLocales = "en";
|
userLocales = "en";
|
||||||
}
|
}
|
||||||
@@ -168,8 +166,12 @@ function createObserver(options, callback) {
|
|||||||
const observerWrapper = new Object();
|
const observerWrapper = new Object();
|
||||||
observerWrapper.options = options;
|
observerWrapper.options = options;
|
||||||
observerWrapper.observer = new MutationObserver(callback);
|
observerWrapper.observer = new MutationObserver(callback);
|
||||||
observerWrapper.observe = function (element) { this.observer.observe(element, this.options); }
|
observerWrapper.observe = function (element) {
|
||||||
observerWrapper.disconnect = function () { this.observer.disconnect(); }
|
this.observer.observe(element, this.options);
|
||||||
|
};
|
||||||
|
observerWrapper.disconnect = function () {
|
||||||
|
this.observer.disconnect();
|
||||||
|
};
|
||||||
return observerWrapper;
|
return observerWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,5 +186,5 @@ export {
|
|||||||
localize,
|
localize,
|
||||||
querySelector,
|
querySelector,
|
||||||
querySelectorAll,
|
querySelectorAll,
|
||||||
createObserver
|
createObserver,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,11 +7,8 @@
|
|||||||
[](https://discord.gg/UMxyMmCgfF)
|
[](https://discord.gg/UMxyMmCgfF)
|
||||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||||
|
|
||||||
|
|
||||||
Read this in other languages: [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Read this in other languages: [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
Lesen sie dies in anderen Sprachen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Lesen sie dies in anderen Sprachen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
+1
-2
@@ -7,8 +7,7 @@
|
|||||||
[](https://discord.gg/UMxyMmCgfF)
|
[](https://discord.gg/UMxyMmCgfF)
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
|
|
||||||
Lisez ceci dans d'autres langues : [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md),[日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Lisez ceci dans d'autres langues : [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md),[日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
Διαθέσιμο στις παρακάτω γλώσσες: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Διαθέσιμο στις παρακάτω γλώσσες: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
別の言語: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
別の言語: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
Lees dit in andere talen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Lees dit in andere talen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ Read this in other languages: [English](README.md), [русский](READMEru.md
|
|||||||
|
|
||||||
Dnia 10 listopada 2021, Google [ogłosiło](https://blog.youtube/news-and-events/update-to-youtube/), że licznik łapek w dół na YouTube zostanie usunięty.
|
Dnia 10 listopada 2021, Google [ogłosiło](https://blog.youtube/news-and-events/update-to-youtube/), że licznik łapek w dół na YouTube zostanie usunięty.
|
||||||
|
|
||||||
Dodatkowo, pole `dislike` w API YouTube zostało [usunięte](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 grudnia 2021, usuwając przy tym jakąkolwiek możliwość oceny jakości filmu przed obejrzeniem.
|
Dodatkowo, pole `dislike` w API YouTube zostało [usunięte](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 grudnia 2021, usuwając przy tym jakąkolwiek możliwość oceny jakości filmu przed obejrzeniem.
|
||||||
|
|
||||||
## Co to robi
|
## Co to robi
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
Прочитать на других языках: [English](README.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Прочитать на других языках: [English](README.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# Return YouTube Dislike
|
# Return YouTube Dislike
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
Bunu diğer dillerde okuyun: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Français](READMEfr.md), [Nederlands](READMEnl.md), [日本語](READMEja.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Bunu diğer dillerde okuyun: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Français](READMEfr.md), [Nederlands](READMEnl.md), [日本語](READMEja.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
|
||||||
# YouTube Dislike Sayısını Geri Getir
|
# YouTube Dislike Sayısını Geri Getir
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
|||||||
+94
-95
@@ -1,95 +1,94 @@
|
|||||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||||
[](https://discord.gg/UMxyMmCgfF)
|
[](https://discord.gg/UMxyMmCgfF)
|
||||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||||
|
|
||||||
Read this in other languages: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
Read this in other languages: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||||
|
|
||||||
|
# Return YouTube Dislike
|
||||||
# Return YouTube Dislike
|
|
||||||
|
<p align="center">
|
||||||
<p align="center">
|
<b>Return YouTube Dislike - це розширення з відкритим вихідним кодом, яке повертає лічильник відміток «Не подобається» на YouTube.</b><br>
|
||||||
<b>Return YouTube Dislike - це розширення з відкритим вихідним кодом, яке повертає лічильник відміток «Не подобається» на YouTube.</b><br>
|
Доступно для Chrome та Firefox як веброзширення.<br>
|
||||||
Доступно для Chrome та Firefox як веброзширення.<br>
|
Також доступно для інших браузерів як JS UserScript.<br><br>
|
||||||
Також доступно для інших браузерів як JS UserScript.<br><br>
|
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
</p>
|
||||||
</p>
|
|
||||||
|
## Історія
|
||||||
## Історія
|
|
||||||
|
10 листопада 2021 року Google [оголосили](https://blog.youtube/news-and-events/update-to-youtube/), що лічильник відміток «Не подобається» на YouTube буде видалено.
|
||||||
10 листопада 2021 року Google [оголосили](https://blog.youtube/news-and-events/update-to-youtube/), що лічильник відміток «Не подобається» на YouTube буде видалено.
|
|
||||||
|
Крім того, поле позначок `dislike` у YouTube API було [видалено](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 грудня 2021 року, прибравши єдину можливість оцінити якість вмісту перед переглядом.
|
||||||
Крім того, поле позначок `dislike` у YouTube API було [видалено](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 грудня 2021 року, прибравши єдину можливість оцінити якість вмісту перед переглядом.
|
|
||||||
|
## Як це працює
|
||||||
## Як це працює
|
|
||||||
|
Після видаленням статистики відміток з API YouTube наш сервер перейшов на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними користувачів розширення.
|
||||||
Після видаленням статистики відміток з API YouTube наш сервер перейшов на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними користувачів розширення.
|
|
||||||
|
[ЧаПи](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQuk.md)
|
||||||
[ЧаПи](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQuk.md)
|
|
||||||
|
## Чому це важливо
|
||||||
## Чому це важливо
|
|
||||||
|
Ви можете дізнатися більше на нашому вебсайті: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||||
Ви можете дізнатися більше на нашому вебсайті: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
|
||||||
|
## Документація API
|
||||||
## Документація API
|
|
||||||
|
Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:
|
||||||
Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:
|
|
||||||
|
- **Атрибуція**: Цей проєкт має бути чітко описано, використовуючи посилання на [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||||
- **Атрибуція**: Цей проєкт має бути чітко описано, використовуючи посилання на [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
- **Обмеження**: Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу.
|
||||||
- **Обмеження**: Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу.
|
|
||||||
|
API доступно за наступною URL-адресою:
|
||||||
API доступно за наступною URL-адресою:
|
https://returnyoutubedislikeapi.com
|
||||||
https://returnyoutubedislikeapi.com
|
|
||||||
|
Перелік доступних «ендпоінтів» можна переглянути тут:
|
||||||
Перелік доступних «ендпоінтів» можна переглянути тут:
|
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
|
||||||
|
### Отримати оцінки
|
||||||
### Отримати оцінки
|
|
||||||
|
Приклад отримання оцінок відео на YouTube за ID:
|
||||||
Приклад отримання оцінок відео на YouTube за ID:
|
`/votes?videoId=kxOuG8jMIgI`
|
||||||
`/votes?videoId=kxOuG8jMIgI`
|
|
||||||
|
```json
|
||||||
```json
|
{
|
||||||
{
|
"id": "kxOuG8jMIgI",
|
||||||
"id": "kxOuG8jMIgI",
|
"dateCreated": "2021-12-20T12:25:54.418014Z",
|
||||||
"dateCreated": "2021-12-20T12:25:54.418014Z",
|
"likes": 27326,
|
||||||
"likes": 27326,
|
"dislikes": 498153,
|
||||||
"dislikes": 498153,
|
"rating": 1.212014408444885,
|
||||||
"rating": 1.212014408444885,
|
"viewCount": 3149885,
|
||||||
"viewCount": 3149885,
|
"deleted": false
|
||||||
"deleted": false
|
}
|
||||||
}
|
```
|
||||||
```
|
|
||||||
|
Недійсний YouTube ID видасть код помилки 404 "Not Found".
|
||||||
Недійсний YouTube ID видасть код помилки 404 "Not Found".
|
YouTube ID у невірному форматі видасть код помилки 400 "Bad Request".
|
||||||
YouTube ID у невірному форматі видасть код помилки 400 "Bad Request".
|
|
||||||
|
<!---
|
||||||
<!---
|
## Документація API
|
||||||
## Документація API
|
|
||||||
|
Ви можете переглянути всю документацію на нашому сайті.
|
||||||
Ви можете переглянути всю документацію на нашому сайті.
|
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
|
||||||
|
## Взяти участь у розробці
|
||||||
## Взяти участь у розробці
|
|
||||||
|
Будь ласка, ознайомтеся із [посібником внеску в проєкт](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGuk.md).
|
||||||
Будь ласка, ознайомтеся із [посібником внеску в проєкт](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGuk.md).
|
|
||||||
|
## Підтримайте цей проєкт!
|
||||||
## Підтримайте цей проєкт!
|
|
||||||
|
Ви можете підтримати цей проєкт пожертвою за посиланням нижче:
|
||||||
Ви можете підтримати цей проєкт пожертвою за посиланням нижче:
|
|
||||||
|
[Підтримати](https://returnyoutubedislike.com/donate)
|
||||||
[Підтримати](https://returnyoutubedislike.com/donate)
|
|
||||||
|
## Спонсори
|
||||||
## Спонсори
|
|
||||||
|
[Piepacker](https://piepacker.com)
|
||||||
[Piepacker](https://piepacker.com)
|
|
||||||
|
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
|
||||||
|
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
|
||||||
|
[Станьте нашим спонсором](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||||
[Станьте нашим спонсором](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
|
||||||
|
|||||||
@@ -54,8 +54,9 @@ export default {
|
|||||||
headers: "En-têtes (headers) : ",
|
headers: "En-têtes (headers) : ",
|
||||||
response: "Réponse : ",
|
response: "Réponse : ",
|
||||||
error1:
|
error1:
|
||||||
'Si aucune vidéo YouTube n\'a cet ID, le code d\'erreur 404 "Not Found" sera retourné',
|
"Si aucune vidéo YouTube n'a cet ID, le code d'erreur 404 \"Not Found\" sera retourné",
|
||||||
error2: 'Un ID YouTube invalide renverra le code d\'erreur *400* "Bad Request"',
|
error2:
|
||||||
|
'Un ID YouTube invalide renverra le code d\'erreur *400* "Bad Request"',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
help: {
|
help: {
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ export default {
|
|||||||
title: "플랫폼 선택",
|
title: "플랫폼 선택",
|
||||||
subtitle: "파이어폭스와 모든 크로미엄 기반 브라우저에서 사용 가능",
|
subtitle: "파이어폭스와 모든 크로미엄 기반 브라우저에서 사용 가능",
|
||||||
title2: "다른 플랫폼",
|
title2: "다른 플랫폼",
|
||||||
subtitle2: "당신의 브라우저가 아직 지원하지 않는 경우, 이 유저스크립트를 시도할 수 있습니다",
|
subtitle2:
|
||||||
|
"당신의 브라우저가 아직 지원하지 않는 경우, 이 유저스크립트를 시도할 수 있습니다",
|
||||||
title3: "서드파티 구현",
|
title3: "서드파티 구현",
|
||||||
subtitle3: "우리 측의 책임이 없으며, 사용자의 책임하에 사용하십시오",
|
subtitle3: "우리 측의 책임이 없으며, 사용자의 책임하에 사용하십시오",
|
||||||
},
|
},
|
||||||
@@ -49,9 +50,9 @@ export default {
|
|||||||
method: "요청 메소드: ",
|
method: "요청 메소드: ",
|
||||||
headers: "헤더: ",
|
headers: "헤더: ",
|
||||||
response: "응답: ",
|
response: "응답: ",
|
||||||
error1: '유효하지 않은 유튜브 ID는 상태 코드 404 "Not Found"를 리턴합니다',
|
error1:
|
||||||
error2:
|
'유효하지 않은 유튜브 ID는 상태 코드 404 "Not Found"를 리턴합니다',
|
||||||
'잘못된 포멧의 유튜브 ID는 400 "Bad Request"를 리턴합니다',
|
error2: '잘못된 포멧의 유튜브 ID는 400 "Bad Request"를 리턴합니다',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
help: {
|
help: {
|
||||||
@@ -63,7 +64,8 @@ export default {
|
|||||||
"확장 프로그램을 제거하고 재설치한 다음, 브라우저를 재시작 하세요(모든 활성 창을 말하며, 단지 하나의 탭을 말하는 것이 아닙니다)",
|
"확장 프로그램을 제거하고 재설치한 다음, 브라우저를 재시작 하세요(모든 활성 창을 말하며, 단지 하나의 탭을 말하는 것이 아닙니다)",
|
||||||
bullet3: "이 링크가 열리는지 확인하세요: ",
|
bullet3: "이 링크가 열리는지 확인하세요: ",
|
||||||
bullet31: "평문이 표시되어야 합니다: ",
|
bullet31: "평문이 표시되어야 합니다: ",
|
||||||
bullet4: "위의 내용이 도움이 되지 않는 경우, 우리의 디스코드에서 다음과 같은 채널에서 당신의 문제를 보고하세요.",
|
bullet4:
|
||||||
|
"위의 내용이 도움이 되지 않는 경우, 우리의 디스코드에서 다음과 같은 채널에서 당신의 문제를 보고하세요.",
|
||||||
bullet41: "디스코드: ",
|
bullet41: "디스코드: ",
|
||||||
bullet4a: "운영체제, 브라우저 이름과 브라우저 버전을 우리한테 말해주세요",
|
bullet4a: "운영체제, 브라우저 이름과 브라우저 버전을 우리한테 말해주세요",
|
||||||
bullet4b:
|
bullet4b:
|
||||||
@@ -78,7 +80,8 @@ export default {
|
|||||||
faq: {
|
faq: {
|
||||||
name: "FAQ",
|
name: "FAQ",
|
||||||
title: "자주 묻는 질문",
|
title: "자주 묻는 질문",
|
||||||
subtitle: "여전히 의문점이 있으신가요? 우리의 디스코드에 무료로 가입하세요!",
|
subtitle:
|
||||||
|
"여전히 의문점이 있으신가요? 우리의 디스코드에 무료로 가입하세요!",
|
||||||
bullet1: "확장 프로그램은 어디에서 데이터를 가져옵니까?",
|
bullet1: "확장 프로그램은 어디에서 데이터를 가져옵니까?",
|
||||||
bullet1text:
|
bullet1text:
|
||||||
"공식 유튜브 싫어요 API가 닫히기 전에 보환된 데이터와 확장 프로그램 사용자 행동을 추정한 값의 조합입니다",
|
"공식 유튜브 싫어요 API가 닫히기 전에 보환된 데이터와 확장 프로그램 사용자 행동을 추정한 값의 조합입니다",
|
||||||
|
|||||||
+14
-7
@@ -5,7 +5,8 @@ export default {
|
|||||||
home: {
|
home: {
|
||||||
name: "Home",
|
name: "Home",
|
||||||
title: "Return YouTube Dislike",
|
title: "Return YouTube Dislike",
|
||||||
subtitle: "Browser-extensie en een API die je antipathieën op YouTube laat zien",
|
subtitle:
|
||||||
|
"Browser-extensie en een API die je antipathieën op YouTube laat zien",
|
||||||
ukraine: "Support Ukraine",
|
ukraine: "Support Ukraine",
|
||||||
sponsors: "Sponsors",
|
sponsors: "Sponsors",
|
||||||
},
|
},
|
||||||
@@ -14,7 +15,8 @@ export default {
|
|||||||
title: "Kies je platform",
|
title: "Kies je platform",
|
||||||
subtitle: "Beschikbaar voor Firefox en alle Chromium-browsers",
|
subtitle: "Beschikbaar voor Firefox en alle Chromium-browsers",
|
||||||
title2: "Andere Platformen",
|
title2: "Andere Platformen",
|
||||||
subtitle2: "Als uw browser nog niet wordt ondersteund, probeer dan dit UserScript",
|
subtitle2:
|
||||||
|
"Als uw browser nog niet wordt ondersteund, probeer dan dit UserScript",
|
||||||
title3: "Implementaties van derden",
|
title3: "Implementaties van derden",
|
||||||
subtitle3: "Geen aansprakelijkheid aan onze kant, gebruik op eigen risico",
|
subtitle3: "Geen aansprakelijkheid aan onze kant, gebruik op eigen risico",
|
||||||
},
|
},
|
||||||
@@ -43,13 +45,15 @@ export default {
|
|||||||
},
|
},
|
||||||
fetching: {
|
fetching: {
|
||||||
title: "Basiscursus ophalen",
|
title: "Basiscursus ophalen",
|
||||||
subtitle: "Voorbeeld om stemmen te krijgen voor een bepaalde YouTube-video-ID: ",
|
subtitle:
|
||||||
|
"Voorbeeld om stemmen te krijgen voor een bepaalde YouTube-video-ID: ",
|
||||||
title2: "Voorbeeld aanvraag: ",
|
title2: "Voorbeeld aanvraag: ",
|
||||||
url: "Verzoek-URL: ",
|
url: "Verzoek-URL: ",
|
||||||
method: "Verzoekmethode:: ",
|
method: "Verzoekmethode:: ",
|
||||||
headers: "Koppen: ",
|
headers: "Koppen: ",
|
||||||
response: "Antwoord: ",
|
response: "Antwoord: ",
|
||||||
error1: 'Een ongeldige YouTube-ID retourneert statuscode 404 "Niet gevonden"',
|
error1:
|
||||||
|
'Een ongeldige YouTube-ID retourneert statuscode 404 "Niet gevonden"',
|
||||||
error2:
|
error2:
|
||||||
'Een onjuist opgemaakte YouTube-ID retourneert 400 "Slecht verzoek"',
|
'Een onjuist opgemaakte YouTube-ID retourneert 400 "Slecht verzoek"',
|
||||||
},
|
},
|
||||||
@@ -57,7 +61,8 @@ export default {
|
|||||||
help: {
|
help: {
|
||||||
name: "Help",
|
name: "Help",
|
||||||
title: "Probleemoplossen",
|
title: "Probleemoplossen",
|
||||||
bullet1: "Zorg ervoor dat u de nieuwste versie van de extensie hebt geïnstalleerd, ",
|
bullet1:
|
||||||
|
"Zorg ervoor dat u de nieuwste versie van de extensie hebt geïnstalleerd, ",
|
||||||
bullet11: "direct",
|
bullet11: "direct",
|
||||||
bullet2:
|
bullet2:
|
||||||
"Probeer de extensie te verwijderen en opnieuw te installeren, en start vervolgens de browser opnieuw (alle actieve vensters, niet slechts één tabblad)",
|
"Probeer de extensie te verwijderen en opnieuw te installeren, en start vervolgens de browser opnieuw (alle actieve vensters, niet slechts één tabblad)",
|
||||||
@@ -78,7 +83,8 @@ export default {
|
|||||||
faq: {
|
faq: {
|
||||||
name: "FAQ",
|
name: "FAQ",
|
||||||
title: "Veel Gestelde Vragen",
|
title: "Veel Gestelde Vragen",
|
||||||
subtitle: "Heeft u nog vragen? Voel je vrij om lid te worden van onze Discord!",
|
subtitle:
|
||||||
|
"Heeft u nog vragen? Voel je vrij om lid te worden van onze Discord!",
|
||||||
bullet1: "Waar haalt de extensie zijn gegevens vandaan?",
|
bullet1: "Waar haalt de extensie zijn gegevens vandaan?",
|
||||||
bullet1text:
|
bullet1text:
|
||||||
"Een combinatie van gearchiveerde gegevens van voordat de officiële YouTube-dislike-API werd afgesloten, en geëxtrapoleerd gebruikersgedrag van extensies.",
|
"Een combinatie van gearchiveerde gegevens van voordat de officiële YouTube-dislike-API werd afgesloten, en geëxtrapoleerd gebruikersgedrag van extensies.",
|
||||||
@@ -97,7 +103,8 @@ export default {
|
|||||||
bullet6: "Hoe werkt de API/Backend?",
|
bullet6: "Hoe werkt de API/Backend?",
|
||||||
bullet6text:
|
bullet6text:
|
||||||
"De backend gebruikt gearchiveerde gegevens van toen de youtube-api nog steeds het aantal dislikes retourneerde, extensiegebruikers zoals het aantal likes/dislikes en extrapolatie. In de nabije toekomst zullen we het voor makers van inhoud mogelijk maken om eenvoudig en veilig hun afkeuren-aantal in te dienen en we zullen de gearchiveerde gegevens van ArchiveTeam (4,56 miljard video's) toevoegen aan onze huidige database. U kunt ook een video over het onderwerp bekijken.",
|
"De backend gebruikt gearchiveerde gegevens van toen de youtube-api nog steeds het aantal dislikes retourneerde, extensiegebruikers zoals het aantal likes/dislikes en extrapolatie. In de nabije toekomst zullen we het voor makers van inhoud mogelijk maken om eenvoudig en veilig hun afkeuren-aantal in te dienen en we zullen de gearchiveerde gegevens van ArchiveTeam (4,56 miljard video's) toevoegen aan onze huidige database. U kunt ook een video over het onderwerp bekijken.",
|
||||||
bullet7: "Waarom wordt bij het aantal dislikes 'DISLIKES DISABLED' weergegeven?",
|
bullet7:
|
||||||
|
"Waarom wordt bij het aantal dislikes 'DISLIKES DISABLED' weergegeven?",
|
||||||
bullet7text:
|
bullet7text:
|
||||||
"Soms kan een recent geüploade video 'DISLIKES UITGESCHAKELD' weergeven, zelfs als de maker dit niet heeft uitgeschakeld. Dit komt door de manier waarop we detecteren of dislikes zijn uitgeschakeld, het zou binnen een paar uur moeten verdwijnen of door de video leuk of niet leuk te vinden en de pagina vernieuwen (hopelijk).",
|
"Soms kan een recent geüploade video 'DISLIKES UITGESCHAKELD' weergeven, zelfs als de maker dit niet heeft uitgeschakeld. Dit komt door de manier waarop we detecteren of dislikes zijn uitgeschakeld, het zou binnen een paar uur moeten verdwijnen of door de video leuk of niet leuk te vinden en de pagina vernieuwen (hopelijk).",
|
||||||
},
|
},
|
||||||
|
|||||||
+12
-6
@@ -5,7 +5,8 @@ export default {
|
|||||||
home: {
|
home: {
|
||||||
name: "Strona główna",
|
name: "Strona główna",
|
||||||
title: "Return YouTube Dislike",
|
title: "Return YouTube Dislike",
|
||||||
subtitle: "Rozszerzenie do przeglądarki i API pokazujące ilość łapek w dół na YouTube",
|
subtitle:
|
||||||
|
"Rozszerzenie do przeglądarki i API pokazujące ilość łapek w dół na YouTube",
|
||||||
ukraine: "Wesprzyj Ukrainę",
|
ukraine: "Wesprzyj Ukrainę",
|
||||||
sponsors: "Sponsorzy",
|
sponsors: "Sponsorzy",
|
||||||
},
|
},
|
||||||
@@ -14,9 +15,11 @@ export default {
|
|||||||
title: "Wybierz swoją platformę",
|
title: "Wybierz swoją platformę",
|
||||||
subtitle: "Dostępne dla Firefox i wszystkich przeglądarek Chromium",
|
subtitle: "Dostępne dla Firefox i wszystkich przeglądarek Chromium",
|
||||||
title2: "Inne platformy",
|
title2: "Inne platformy",
|
||||||
subtitle2: "Jeżeli twoja przeglądarka nie jest wspierana, wypróbuj ten UserScript",
|
subtitle2:
|
||||||
|
"Jeżeli twoja przeglądarka nie jest wspierana, wypróbuj ten UserScript",
|
||||||
title3: "Implementacje od stron trzecich",
|
title3: "Implementacje od stron trzecich",
|
||||||
subtitle3: "Nie ponosimy za nie odpowiedzialności, używasz na własne ryzyko",
|
subtitle3:
|
||||||
|
"Nie ponosimy za nie odpowiedzialności, używasz na własne ryzyko",
|
||||||
},
|
},
|
||||||
api: {
|
api: {
|
||||||
name: "API",
|
name: "API",
|
||||||
@@ -43,7 +46,8 @@ export default {
|
|||||||
},
|
},
|
||||||
fetching: {
|
fetching: {
|
||||||
title: "Poradnik - Podstawowe pobieranie",
|
title: "Poradnik - Podstawowe pobieranie",
|
||||||
subtitle: "Przykład pozwalający otrzymać głosy z danego ID filmu na YouTube: ",
|
subtitle:
|
||||||
|
"Przykład pozwalający otrzymać głosy z danego ID filmu na YouTube: ",
|
||||||
title2: "Przykładowe żądanie: ",
|
title2: "Przykładowe żądanie: ",
|
||||||
url: "URL żądania: ",
|
url: "URL żądania: ",
|
||||||
method: "Metoda żądania: ",
|
method: "Metoda żądania: ",
|
||||||
@@ -57,7 +61,8 @@ export default {
|
|||||||
help: {
|
help: {
|
||||||
name: "Pomoc",
|
name: "Pomoc",
|
||||||
title: "Rozwiązywanie problemów",
|
title: "Rozwiązywanie problemów",
|
||||||
bullet1: "Upewnij się, że masz zainstalowaną najnowszą wersję rozszerzenia, ",
|
bullet1:
|
||||||
|
"Upewnij się, że masz zainstalowaną najnowszą wersję rozszerzenia, ",
|
||||||
bullet11: "obecnie.",
|
bullet11: "obecnie.",
|
||||||
bullet2:
|
bullet2:
|
||||||
"Spróbuj usunąć rozszerzenie i zainstalować je ponownie, a następnie zrestartować przeglądarkę (wszystkie aktywne okna, nie tylko jedną kartę)",
|
"Spróbuj usunąć rozszerzenie i zainstalować je ponownie, a następnie zrestartować przeglądarkę (wszystkie aktywne okna, nie tylko jedną kartę)",
|
||||||
@@ -65,7 +70,8 @@ export default {
|
|||||||
bullet31: "powinno się wyświetlić w czystym tekście: ",
|
bullet31: "powinno się wyświetlić w czystym tekście: ",
|
||||||
bullet4: "Jeśli nic powyżej nie pomoże - zgłoś problem na",
|
bullet4: "Jeśli nic powyżej nie pomoże - zgłoś problem na",
|
||||||
bullet41: "na naszym",
|
bullet41: "na naszym",
|
||||||
bullet4a: "Powiedz z jakiego systemu operacyjnego korzystasz, oraz podaj nazwę i wersję przeglądarki",
|
bullet4a:
|
||||||
|
"Powiedz z jakiego systemu operacyjnego korzystasz, oraz podaj nazwę i wersję przeglądarki",
|
||||||
bullet4b:
|
bullet4b:
|
||||||
"Wykonaj zrzut ekranu problematycznej strony (tj. strony filmu na YouTube) z otwartą konsolą (naciśnij ",
|
"Wykonaj zrzut ekranu problematycznej strony (tj. strony filmu na YouTube) z otwartą konsolą (naciśnij ",
|
||||||
bullet4b1: ") - przykładowy zrzut poniżej.",
|
bullet4b1: ") - przykładowy zrzut poniżej.",
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import { sv_SE } from "vuetify/src/locale";
|
import { sv } from "vuetify/src/locale";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
...sv_SE,
|
...sv,
|
||||||
home: {
|
home: {
|
||||||
name: "Hem",
|
name: "Hem",
|
||||||
title: "Return YouTube Dislike",
|
title: "Return YouTube Dislike",
|
||||||
subtitle: "Webbläsartillägg och ett API som visar antalet ogilla på Youtube",
|
subtitle:
|
||||||
|
"Webbläsartillägg och ett API som visar antalet ogilla på Youtube",
|
||||||
ukraine: "Stöd Ukraina",
|
ukraine: "Stöd Ukraina",
|
||||||
sponsors: "Sponsorer",
|
sponsors: "Sponsorer",
|
||||||
},
|
},
|
||||||
@@ -43,7 +44,8 @@ export default {
|
|||||||
},
|
},
|
||||||
fetching: {
|
fetching: {
|
||||||
title: "Grundläggande handledning för hämtning",
|
title: "Grundläggande handledning för hämtning",
|
||||||
subtitle: "Exempel för att hämta röster för ett bestämt YouTubevideo-ID: ",
|
subtitle:
|
||||||
|
"Exempel för att hämta röster för ett bestämt YouTubevideo-ID: ",
|
||||||
title2: "Example Request: ",
|
title2: "Example Request: ",
|
||||||
url: "Request URL: ",
|
url: "Request URL: ",
|
||||||
method: "Request Method: ",
|
method: "Request Method: ",
|
||||||
@@ -57,7 +59,8 @@ export default {
|
|||||||
help: {
|
help: {
|
||||||
name: "Hjälp",
|
name: "Hjälp",
|
||||||
title: "Felsökning",
|
title: "Felsökning",
|
||||||
bullet1: "Se till att du har den senaste versionen av tillägget installerat, ",
|
bullet1:
|
||||||
|
"Se till att du har den senaste versionen av tillägget installerat, ",
|
||||||
bullet11: "just nu",
|
bullet11: "just nu",
|
||||||
bullet2:
|
bullet2:
|
||||||
"Försök att avinstallera tillägget och installera det igen, starta sedan om webbläsaren (alla aktiva fönster, inte bara en flik)",
|
"Försök att avinstallera tillägget och installera det igen, starta sedan om webbläsaren (alla aktiva fönster, inte bara en flik)",
|
||||||
@@ -65,7 +68,8 @@ export default {
|
|||||||
bullet31: "du bör se vanlig text: ",
|
bullet31: "du bör se vanlig text: ",
|
||||||
bullet4: "Om inget av ovanstående hjälper - rapportera ditt problem i",
|
bullet4: "Om inget av ovanstående hjälper - rapportera ditt problem i",
|
||||||
bullet41: "i vår",
|
bullet41: "i vår",
|
||||||
bullet4a: "Tala om för oss ditt operativsystem, webbläsarnamn och webbläsarversion",
|
bullet4a:
|
||||||
|
"Tala om för oss ditt operativsystem, webbläsarnamn och webbläsarversion",
|
||||||
bullet4b:
|
bullet4b:
|
||||||
"Ta en skärmdump av sidan du har problem med (t.ex en youtube-videosida) med konsolfönstret öppet (tryck ",
|
"Ta en skärmdump av sidan du har problem med (t.ex en youtube-videosida) med konsolfönstret öppet (tryck ",
|
||||||
bullet4b1: ") - exempel på skärmdump nedan.",
|
bullet4b1: ") - exempel på skärmdump nedan.",
|
||||||
@@ -97,7 +101,7 @@ export default {
|
|||||||
bullet6: "Hur fungerar API/Backend?",
|
bullet6: "Hur fungerar API/Backend?",
|
||||||
bullet6text:
|
bullet6text:
|
||||||
"Backend använder arkiverad data från när YouTubes API fortfarande returnerade antalet ogilla. Inom en snar framtid kommer vi att tillåta innehållsskapare att enkelt och säkert skicka in sina ogilla och vi kommer att lägga till ArchiveTeams arkiverade data (4,56 miljarder videor) i vår nuvarande databas. Du kan också se en video om ämnet.",
|
"Backend använder arkiverad data från när YouTubes API fortfarande returnerade antalet ogilla. Inom en snar framtid kommer vi att tillåta innehållsskapare att enkelt och säkert skicka in sina ogilla och vi kommer att lägga till ArchiveTeams arkiverade data (4,56 miljarder videor) i vår nuvarande databas. Du kan också se en video om ämnet.",
|
||||||
bullet7: "Varför visar antalet ogilla "OGILLA ÄR INAKTIVERAT"?",
|
bullet7: "Varför visar antalet ogilla 'OGILLA ÄR INAKTIVERAT'?",
|
||||||
bullet7text:
|
bullet7text:
|
||||||
"I bland kan en nyligen uppladdad video visa 'OGILLA ÄR INAKTIVERAT' även om ägaren inte har inaktiverat den. Detta beror på hur informationen om ogilla är inaktiverat hämtas ut. Det bör försvinna inom några timmar eller genom att gilla eller ogilla videon och uppdatera sidan (förhoppningsvis).",
|
"I bland kan en nyligen uppladdad video visa 'OGILLA ÄR INAKTIVERAT' även om ägaren inte har inaktiverat den. Detta beror på hur informationen om ogilla är inaktiverat hämtas ut. Det bör försvinna inom några timmar eller genom att gilla eller ogilla videon och uppdatera sidan (förhoppningsvis).",
|
||||||
},
|
},
|
||||||
+17
-10
@@ -5,7 +5,8 @@ export default {
|
|||||||
home: {
|
home: {
|
||||||
name: "Ana Sayfa",
|
name: "Ana Sayfa",
|
||||||
title: "YouTube Dislike Sayısını Geri Getir",
|
title: "YouTube Dislike Sayısını Geri Getir",
|
||||||
subtitle: "YouTube'daki dislike sayılarınızı geri getiren bir tarayıcı uzantısı ve API",
|
subtitle:
|
||||||
|
"YouTube'daki dislike sayılarınızı geri getiren bir tarayıcı uzantısı ve API",
|
||||||
ukraine: "Ukrayna'ya Destek Ol",
|
ukraine: "Ukrayna'ya Destek Ol",
|
||||||
sponsors: "Sponsorlar",
|
sponsors: "Sponsorlar",
|
||||||
},
|
},
|
||||||
@@ -14,9 +15,11 @@ export default {
|
|||||||
title: "Platformunuzu Seçin",
|
title: "Platformunuzu Seçin",
|
||||||
subtitle: "Firefox ve bütün Chromium tabanlı tarayıcılarda kullanılabilir",
|
subtitle: "Firefox ve bütün Chromium tabanlı tarayıcılarda kullanılabilir",
|
||||||
title2: "Diğer Platformlar",
|
title2: "Diğer Platformlar",
|
||||||
subtitle2: "Tarayıcınız henüz desteklenmiyorsa UserScript yöntemini deneyin",
|
subtitle2:
|
||||||
|
"Tarayıcınız henüz desteklenmiyorsa UserScript yöntemini deneyin",
|
||||||
title3: "Üçüncü Parti Uygulamalar",
|
title3: "Üçüncü Parti Uygulamalar",
|
||||||
subtitle3: "Riski tamamen size aittir, bizim tarafımızda sorumluluk kabul edilmemektedir",
|
subtitle3:
|
||||||
|
"Riski tamamen size aittir, bizim tarafımızda sorumluluk kabul edilmemektedir",
|
||||||
},
|
},
|
||||||
api: {
|
api: {
|
||||||
name: "API",
|
name: "API",
|
||||||
@@ -43,7 +46,8 @@ export default {
|
|||||||
},
|
},
|
||||||
fetching: {
|
fetching: {
|
||||||
title: "Temel Veri Alma Eğitimi",
|
title: "Temel Veri Alma Eğitimi",
|
||||||
subtitle: "Belirli bir YouTube ID'sinin oylamalarını elde etmek için bir örnek: ",
|
subtitle:
|
||||||
|
"Belirli bir YouTube ID'sinin oylamalarını elde etmek için bir örnek: ",
|
||||||
title2: "Örnek İstek: ",
|
title2: "Örnek İstek: ",
|
||||||
url: "İstek URL'si: ",
|
url: "İstek URL'si: ",
|
||||||
method: "İstek Yöntemi: ",
|
method: "İstek Yöntemi: ",
|
||||||
@@ -64,11 +68,13 @@ export default {
|
|||||||
bullet3: "Şu bağlantıyı açtığınızdan emin olun: ",
|
bullet3: "Şu bağlantıyı açtığınızdan emin olun: ",
|
||||||
bullet31: "şöyle bir düz metin görmelisiniz: ",
|
bullet31: "şöyle bir düz metin görmelisiniz: ",
|
||||||
bullet4: "Yukarıdakiler yardımcı olmadıysa - Discord sunucumuzdaki ",
|
bullet4: "Yukarıdakiler yardımcı olmadıysa - Discord sunucumuzdaki ",
|
||||||
bullet41: " kanalından problemi bildirin (İngilizce bir şekilde) Discord sunucumuz: ",
|
bullet41:
|
||||||
bullet4a: "Bize İşletim Sisteminizi, Tarayıcı Adınızı ve Tarayıcı Sürümünüzü söyleyin",
|
" kanalından problemi bildirin (İngilizce bir şekilde) Discord sunucumuz: ",
|
||||||
bullet4b:
|
bullet4a:
|
||||||
"Konsol açıkken (açmak için ",
|
"Bize İşletim Sisteminizi, Tarayıcı Adınızı ve Tarayıcı Sürümünüzü söyleyin",
|
||||||
bullet4b1: " tuşuna basın) sorunu yaşadığınız sayfanın ekran görüntüsünü alın (yani YouTube watch sayfasının) - Ekran görüntüsü örneği aşağıdadır.",
|
bullet4b: "Konsol açıkken (açmak için ",
|
||||||
|
bullet4b1:
|
||||||
|
" tuşuna basın) sorunu yaşadığınız sayfanın ekran görüntüsünü alın (yani YouTube watch sayfasının) - Ekran görüntüsü örneği aşağıdadır.",
|
||||||
bullet4c:
|
bullet4c:
|
||||||
"Uzantı yüklüyken tarayıcınızın uzantılar sayfasının ekran görüntüsünü alın.",
|
"Uzantı yüklüyken tarayıcınızın uzantılar sayfasının ekran görüntüsünü alın.",
|
||||||
bullet4c1: "Uzantıları görmek için şu linki adres çubuğuna yapıştırın: ",
|
bullet4c1: "Uzantıları görmek için şu linki adres çubuğuna yapıştırın: ",
|
||||||
@@ -78,7 +84,8 @@ export default {
|
|||||||
faq: {
|
faq: {
|
||||||
name: "SSS",
|
name: "SSS",
|
||||||
title: "Sıkça Sorulan Sorular",
|
title: "Sıkça Sorulan Sorular",
|
||||||
subtitle: "Hâlâ sorun mu yaşıyorsunuz? Discord sunucumuza katılmaktan çekinmeyin! (İngilizce)",
|
subtitle:
|
||||||
|
"Hâlâ sorun mu yaşıyorsunuz? Discord sunucumuza katılmaktan çekinmeyin! (İngilizce)",
|
||||||
bullet1: "Uzantı, verileri nereden alıyor?",
|
bullet1: "Uzantı, verileri nereden alıyor?",
|
||||||
bullet1text:
|
bullet1text:
|
||||||
"Resmî YouTube dislike sayısı API'si kapatılmadan önceki arşivlenmiş verilerden ve tahmin edilen uzantı kullanıcısı davranışının bir birleşimiyle.",
|
"Resmî YouTube dislike sayısı API'si kapatılmadan önceki arşivlenmiş verilerden ve tahmin edilen uzantı kullanıcısı davranışının bir birleşimiyle.",
|
||||||
|
|||||||
+125
-119
@@ -1,119 +1,125 @@
|
|||||||
import { uk } from "vuetify/src/locale";
|
import { uk } from "vuetify/src/locale";
|
||||||
// By dsty#1614
|
// By dsty#1614
|
||||||
export default {
|
export default {
|
||||||
...uk,
|
...uk,
|
||||||
home: {
|
home: {
|
||||||
name: "Головна",
|
name: "Головна",
|
||||||
title: "Return YouTube Dislike",
|
title: "Return YouTube Dislike",
|
||||||
subtitle: "Браузерне розширення та API, що дозволяє вам бачити відмітки «Не подобається» на YouTube",
|
subtitle:
|
||||||
ukraine: "Підтримати Україну",
|
"Браузерне розширення та API, що дозволяє вам бачити відмітки «Не подобається» на YouTube",
|
||||||
sponsors: "Спонсори",
|
ukraine: "Підтримати Україну",
|
||||||
},
|
sponsors: "Спонсори",
|
||||||
install: {
|
},
|
||||||
name: "Завантажити",
|
install: {
|
||||||
title: "Оберіть вашу платформу",
|
name: "Завантажити",
|
||||||
subtitle: "Доступно на Firefox та усіх Chromium браузерах",
|
title: "Оберіть вашу платформу",
|
||||||
title2: "Інші платформи",
|
subtitle: "Доступно на Firefox та усіх Chromium браузерах",
|
||||||
subtitle2: "Якщо ваш браузер не підтримується, спробуйте цей UserScript",
|
title2: "Інші платформи",
|
||||||
title3: "Стороннє ПЗ",
|
subtitle2: "Якщо ваш браузер не підтримується, спробуйте цей UserScript",
|
||||||
subtitle3: "Ми не маємо відношення до цього, використовуйте на свій страх і ризик",
|
title3: "Стороннє ПЗ",
|
||||||
},
|
subtitle3:
|
||||||
api: {
|
"Ми не маємо відношення до цього, використовуйте на свій страх і ризик",
|
||||||
name: "API",
|
},
|
||||||
title: "Вітаємо у офіційній документації RYD!",
|
api: {
|
||||||
subtitle: "Щоб почати, виберіть розділ у меню.",
|
name: "API",
|
||||||
rights: {
|
title: "Вітаємо у офіційній документації RYD!",
|
||||||
title: "Права використання",
|
subtitle: "Щоб почати, виберіть розділ у меню.",
|
||||||
subtitle:
|
rights: {
|
||||||
"Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:",
|
title: "Права використання",
|
||||||
bullet1: "Атрибуція: ",
|
subtitle:
|
||||||
bullet1text:
|
"Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:",
|
||||||
"Цей проєкт має бути чітко описано, використовуючи посилання, або ж на цей репозиторій, або ж на returnyoutubedislike.com",
|
bullet1: "Атрибуція: ",
|
||||||
bullet2: "Обмеження: ",
|
bullet1text:
|
||||||
bullet2text:
|
"Цей проєкт має бути чітко описано, використовуючи посилання, або ж на цей репозиторій, або ж на returnyoutubedislike.com",
|
||||||
"Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу",
|
bullet2: "Обмеження: ",
|
||||||
},
|
bullet2text:
|
||||||
url: {
|
"Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу",
|
||||||
title: "Інформація про посилання",
|
},
|
||||||
subtitle: "API доступний за наступним посиланням: ",
|
url: {
|
||||||
},
|
title: "Інформація про посилання",
|
||||||
endpoints: {
|
subtitle: "API доступний за наступним посиланням: ",
|
||||||
title: "Достпупні «ендпоінти»",
|
},
|
||||||
subtitle: "Перелік доступних «ендпоінтів» можна переглянути тут: ",
|
endpoints: {
|
||||||
},
|
title: "Достпупні «ендпоінти»",
|
||||||
fetching: {
|
subtitle: "Перелік доступних «ендпоінтів» можна переглянути тут: ",
|
||||||
title: "Базовий посібник по отриманню",
|
},
|
||||||
subtitle: "Приклад отримання оцінок відео на YouTube за ID ",
|
fetching: {
|
||||||
title2: "Приклад запиту: ",
|
title: "Базовий посібник по отриманню",
|
||||||
url: "Посилання запиту: ",
|
subtitle: "Приклад отримання оцінок відео на YouTube за ID ",
|
||||||
method: "Метод запиту: ",
|
title2: "Приклад запиту: ",
|
||||||
headers: "Заголовок: ",
|
url: "Посилання запиту: ",
|
||||||
response: "Відповідь: ",
|
method: "Метод запиту: ",
|
||||||
error1: 'Недійсний YouTube ID видасть код помилки 404 "Not Found"',
|
headers: "Заголовок: ",
|
||||||
error2:
|
response: "Відповідь: ",
|
||||||
'YouTube ID у невірному форматі видасть код помилки 400 "Bad Request"',
|
error1: 'Недійсний YouTube ID видасть код помилки 404 "Not Found"',
|
||||||
},
|
error2:
|
||||||
},
|
'YouTube ID у невірному форматі видасть код помилки 400 "Bad Request"',
|
||||||
help: {
|
},
|
||||||
name: "Допомога",
|
},
|
||||||
title: "Усунення несправностей",
|
help: {
|
||||||
bullet1: "Переконайтеся, що у вас встановлена остання версія розширення, наразі це - ",
|
name: "Допомога",
|
||||||
bullet11: "",
|
title: "Усунення несправностей",
|
||||||
bullet2:
|
bullet1:
|
||||||
"Спробуйте видалити розширення і встановити його знову, а потім перезавантажте браузер (усі активні вікна, а не лише одну вкладку).",
|
"Переконайтеся, що у вас встановлена остання версія розширення, наразі це - ",
|
||||||
bullet3: "Переконайтеся, що наступне посилання відкривається: ",
|
bullet11: "",
|
||||||
bullet31: "і ви бачите там цей текст: ",
|
bullet2:
|
||||||
bullet4: "Якщо нічого з перерахованого вище не допомогло - повідомте про проблему в каналі",
|
"Спробуйте видалити розширення і встановити його знову, а потім перезавантажте браузер (усі активні вікна, а не лише одну вкладку).",
|
||||||
bullet41: "у нашому",
|
bullet3: "Переконайтеся, що наступне посилання відкривається: ",
|
||||||
bullet4a: "Повідомте нам вашу операційну систему, назву та версію браузера",
|
bullet31: "і ви бачите там цей текст: ",
|
||||||
bullet4b:
|
bullet4:
|
||||||
"Зробіть знімок екрана сторінки з проблемою (тобто сторінки відео на YouTube) із відкритою консоллю (натисніть ",
|
"Якщо нічого з перерахованого вище не допомогло - повідомте про проблему в каналі",
|
||||||
bullet4b1: ") - приклад знімка екрана нижче.",
|
bullet41: "у нашому",
|
||||||
bullet4c:
|
bullet4a: "Повідомте нам вашу операційну систему, назву та версію браузера",
|
||||||
"Зробіть знімок екрана сторінки з встановленими розширеннями вашого браузера.",
|
bullet4b:
|
||||||
bullet4c1: "Щоб побачити розширення, напишіть це в адресний рядок: ",
|
"Зробіть знімок екрана сторінки з проблемою (тобто сторінки відео на YouTube) із відкритою консоллю (натисніть ",
|
||||||
firefox: "для Firefox",
|
bullet4b1: ") - приклад знімка екрана нижче.",
|
||||||
chrome: "для Chrome, Edge, Brave, Opera, Vivaldi",
|
bullet4c:
|
||||||
},
|
"Зробіть знімок екрана сторінки з встановленими розширеннями вашого браузера.",
|
||||||
faq: {
|
bullet4c1: "Щоб побачити розширення, напишіть це в адресний рядок: ",
|
||||||
name: "ЧаПи",
|
firefox: "для Firefox",
|
||||||
title: "Часті питання",
|
chrome: "для Chrome, Edge, Brave, Opera, Vivaldi",
|
||||||
subtitle: "Залишилися питання? Не соромтеся приєднуватися до нашого Discord!",
|
},
|
||||||
bullet1: "Звідки розширення отримує дані?",
|
faq: {
|
||||||
bullet1text:
|
name: "ЧаПи",
|
||||||
"Комбінація архівних даних, отриманих до закриття офіційного API відміток «Не подобається» на YouTube та екстрапольованої поведінки користувачів розширення.",
|
title: "Часті питання",
|
||||||
bullet2: "Чому кількість відміток «Не подобається» не оновлюється?",
|
subtitle:
|
||||||
bullet2text:
|
"Залишилися питання? Не соромтеся приєднуватися до нашого Discord!",
|
||||||
"Наразі відмітки «Не подобається» кешуються й не оновлюються надто часто. Це залежить від популярності відео, але для оновлення може знадобитися від кількох годин до кількох днів.",
|
bullet1: "Звідки розширення отримує дані?",
|
||||||
bullet3: "Як це працює?",
|
bullet1text:
|
||||||
bullet3text:
|
"Комбінація архівних даних, отриманих до закриття офіційного API відміток «Не подобається» на YouTube та екстрапольованої поведінки користувачів розширення.",
|
||||||
"Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API. Потім розширення відображає кількість відміток «Не подобається» та їх коефіцієнт на сторінці. Якщо ви ставите відмітки «Подобається» чи «Не подобається», це записується та надсилається до бази даних, щоб можна було екстраполювати точну їх кількість нелайків.",
|
bullet2: "Чому кількість відміток «Не подобається» не оновлюється?",
|
||||||
bullet4: "Чи можу я поділитися з вами своїми відмітками «Не подобається»?",
|
bullet2text:
|
||||||
bullet4text:
|
"Наразі відмітки «Не подобається» кешуються й не оновлюються надто часто. Це залежить від популярності відео, але для оновлення може знадобитися від кількох годин до кількох днів.",
|
||||||
"Незабаром. Ми розглядаємо можливість використання Oauth або іншого API, доступного тільки для читання, з обмеженою областю дій, щоб творці могли ділитися своїми відмітками «Не подобається»",
|
bullet3: "Як це працює?",
|
||||||
bullet5: "Які дані ви збираєте та як вони обробляються?",
|
bullet3text:
|
||||||
bullet5text:
|
"Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API. Потім розширення відображає кількість відміток «Не подобається» та їх коефіцієнт на сторінці. Якщо ви ставите відмітки «Подобається» чи «Не подобається», це записується та надсилається до бази даних, щоб можна було екстраполювати точну їх кількість нелайків.",
|
||||||
'Розширення збирає лише ті дані, які необхідні для правильної його роботи, такі як IP-адреси або ID відео, яке ви дивитеся. Ваші дані ніколи не будуть продані третім особам. Якщо ви хочете дізнатися більше про те, як ми забезпечуємо безпеку та конфіденційність, ознайомтесь з нашими <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">ЧаПи по безпеці</a>.',
|
bullet4: "Чи можу я поділитися з вами своїми відмітками «Не подобається»?",
|
||||||
bullet6: "Як працює API/серверна сторона?",
|
bullet4text:
|
||||||
bullet6text:
|
"Незабаром. Ми розглядаємо можливість використання Oauth або іншого API, доступного тільки для читання, з обмеженою областю дій, щоб творці могли ділитися своїми відмітками «Не подобається»",
|
||||||
"Серверна частина використовує архівні дані з тих пір, доки YouTube API все ще видавав кількість відміток «Не подобається», а також відмітки «Подобається»/«Не подобається» користувачів розширення та екстраполяцію. В найближчому майбутньому ми дозволимо творцям контенту легко та безпечно надсилати свої відмітки «Не подобається», а також ми додамо архівні дані ArchiveTeam (4,56 мільярди відео) до нашої поточної бази даних. Ви можете переглянути відео на цю тему.",
|
bullet5: "Які дані ви збираєте та як вони обробляються?",
|
||||||
bullet7: "Чому лічильник відміток «Не подобається» пише 'DISLIKES DISABLED'?",
|
bullet5text:
|
||||||
bullet7text:
|
'Розширення збирає лише ті дані, які необхідні для правильної його роботи, такі як IP-адреси або ID відео, яке ви дивитеся. Ваші дані ніколи не будуть продані третім особам. Якщо ви хочете дізнатися більше про те, як ми забезпечуємо безпеку та конфіденційність, ознайомтесь з нашими <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">ЧаПи по безпеці</a>.',
|
||||||
"Іноді на нещодавно завантаженому відео може з'являтися повідомлення 'DISLIKES DISABLED', навіть попри те, що автор не вимикав відмітки «Не подобається». Це пов’язано з тим, як ми визначаємо, чи вимкнені оцінки «Не подобається». Це повідомлення має зникнути через кілька годин або після отримання відмітки «Подобається»/«Не подобається» і оновлення сторінки (сподіваюся).",
|
bullet6: "Як працює API/серверна сторона?",
|
||||||
},
|
bullet6text:
|
||||||
donate: {
|
"Серверна частина використовує архівні дані з тих пір, доки YouTube API все ще видавав кількість відміток «Не подобається», а також відмітки «Подобається»/«Не подобається» користувачів розширення та екстраполяцію. В найближчому майбутньому ми дозволимо творцям контенту легко та безпечно надсилати свої відмітки «Не подобається», а також ми додамо архівні дані ArchiveTeam (4,56 мільярди відео) до нашої поточної бази даних. Ви можете переглянути відео на цю тему.",
|
||||||
name: "Підтримати",
|
bullet7:
|
||||||
subtitle:
|
"Чому лічильник відміток «Не подобається» пише 'DISLIKES DISABLED'?",
|
||||||
"Ви можете підтримати пожертвою наші зусилля зробити Інтернет вільнішим!",
|
bullet7text:
|
||||||
},
|
"Іноді на нещодавно завантаженому відео може з'являтися повідомлення 'DISLIKES DISABLED', навіть попри те, що автор не вимикав відмітки «Не подобається». Це пов’язано з тим, як ми визначаємо, чи вимкнені оцінки «Не подобається». Це повідомлення має зникнути через кілька годин або після отримання відмітки «Подобається»/«Не подобається» і оновлення сторінки (сподіваюся).",
|
||||||
links: {
|
},
|
||||||
name: "Посилання",
|
donate: {
|
||||||
title: "Посилання проєкту",
|
name: "Підтримати",
|
||||||
subtitle: "Посилання на проєкт і його розробників",
|
subtitle:
|
||||||
contact: "Зв'язок зі мною",
|
"Ви можете підтримати пожертвою наші зусилля зробити Інтернет вільнішим!",
|
||||||
translators: "Перекладачі",
|
},
|
||||||
coolProjects: "Круті проєкти",
|
links: {
|
||||||
sponsorBlockDescription: "пропускає вбудовану у відео рекламу",
|
name: "Посилання",
|
||||||
filmotDescription: "пошук відео на YouTube по субтитрах",
|
title: "Посилання проєкту",
|
||||||
},
|
subtitle: "Посилання на проєкт і його розробників",
|
||||||
};
|
contact: "Зв'язок зі мною",
|
||||||
|
translators: "Перекладачі",
|
||||||
|
coolProjects: "Круті проєкти",
|
||||||
|
sponsorBlockDescription: "пропускає вбудовану у відео рекламу",
|
||||||
|
filmotDescription: "пошук відео на YouTube по субтитрах",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ export default {
|
|||||||
// { name: "Deutsch", locale: "de" },
|
// { name: "Deutsch", locale: "de" },
|
||||||
{ name: "Українська", locale: "uk" },
|
{ name: "Українська", locale: "uk" },
|
||||||
{ name: "한국어", locale: "ko" },
|
{ name: "한국어", locale: "ko" },
|
||||||
{ name: "Polski", locale: "pl"},
|
{ name: "Polski", locale: "pl" },
|
||||||
],
|
],
|
||||||
alert: {
|
alert: {
|
||||||
show: false,
|
show: false,
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ export default {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.$axios
|
this.$axios
|
||||||
.$get(
|
.$get(
|
||||||
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json"
|
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json",
|
||||||
)
|
)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
this.userInformation.extension.latestExtensionVersion = res.version;
|
this.userInformation.extension.latestExtensionVersion = res.version;
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ export default {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
fetch(
|
fetch(
|
||||||
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json"
|
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json",
|
||||||
)
|
)
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
.then((json) => {
|
.then((json) => {
|
||||||
|
|||||||
@@ -125,13 +125,13 @@ export default {
|
|||||||
if (videoId !== lastVideoId && videoId.length === 11) {
|
if (videoId !== lastVideoId && videoId.length === 11) {
|
||||||
fetch(
|
fetch(
|
||||||
"https://returnyoutubedislikeapi.com/votes?videoId=" +
|
"https://returnyoutubedislikeapi.com/votes?videoId=" +
|
||||||
(lastVideoId = videoId)
|
(lastVideoId = videoId),
|
||||||
)
|
)
|
||||||
.then((resp) => resp.json())
|
.then((resp) => resp.json())
|
||||||
.then(
|
.then(
|
||||||
(data) =>
|
(data) =>
|
||||||
(document.getElementById("output").innerText =
|
(document.getElementById("output").innerText =
|
||||||
"Likes=" + data.likes + " Dislikes=" + data.dislikes)
|
"Likes=" + data.likes + " Dislikes=" + data.dislikes),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -162,7 +162,8 @@ input {
|
|||||||
stroke: #f44;
|
stroke: #f44;
|
||||||
transition-property: opacity, transform;
|
transition-property: opacity, transform;
|
||||||
transform: scale(0) rotate(180deg);
|
transform: scale(0) rotate(180deg);
|
||||||
animation: popin 1s 0.3s ease-in-out 1 forwards,
|
animation:
|
||||||
|
popin 1s 0.3s ease-in-out 1 forwards,
|
||||||
tap 0.3s 1.7s ease-in-out 1 forwards;
|
tap 0.3s 1.7s ease-in-out 1 forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ export default {
|
|||||||
{
|
{
|
||||||
tag: "itsbudyn#6502",
|
tag: "itsbudyn#6502",
|
||||||
lang: "Polski",
|
lang: "Polski",
|
||||||
}
|
},
|
||||||
],
|
],
|
||||||
coolProjects: [
|
coolProjects: [
|
||||||
{
|
{
|
||||||
|
|||||||
+8
-1
@@ -8,7 +8,11 @@
|
|||||||
"dev": "webpack --mode=production --watch",
|
"dev": "webpack --mode=production --watch",
|
||||||
"build": "webpack --mode=production",
|
"build": "webpack --mode=production",
|
||||||
"build:safari": "webpack --mode=production && xcrun safari-web-extension-converter Extensions/combined/dist/safari --project-location Extensions/combined/dist --bundle-identifier com.returnyoutubedislike.safari-ext --force",
|
"build:safari": "webpack --mode=production && xcrun safari-web-extension-converter Extensions/combined/dist/safari --project-location Extensions/combined/dist --bundle-identifier com.returnyoutubedislike.safari-ext --force",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"prepare": "husky install"
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"*": "prettier --write --ignore-unknown"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -32,6 +36,9 @@
|
|||||||
"babel-loader": "^9.1.3",
|
"babel-loader": "^9.1.3",
|
||||||
"copy-webpack-plugin": "^11.0.0",
|
"copy-webpack-plugin": "^11.0.0",
|
||||||
"filemanager-webpack-plugin": "^8.0.0",
|
"filemanager-webpack-plugin": "^8.0.0",
|
||||||
|
"husky": "^8.0.0",
|
||||||
|
"lint-staged": "^15.2.0",
|
||||||
|
"prettier": "^3.2.2",
|
||||||
"webpack": "^5.89.0",
|
"webpack": "^5.89.0",
|
||||||
"webpack-cli": "^5.1.4"
|
"webpack-cli": "^5.1.4"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -17,7 +17,7 @@ module.exports = {
|
|||||||
entries.map((entry) => [
|
entries.map((entry) => [
|
||||||
entry,
|
entry,
|
||||||
path.join(__dirname, "./Extensions/combined/", `${entry}.js`),
|
path.join(__dirname, "./Extensions/combined/", `${entry}.js`),
|
||||||
])
|
]),
|
||||||
),
|
),
|
||||||
output: {
|
output: {
|
||||||
filename: "[name].js",
|
filename: "[name].js",
|
||||||
@@ -89,7 +89,6 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
|
||||||
],
|
],
|
||||||
experiments: {
|
experiments: {
|
||||||
topLevelAwait: true,
|
topLevelAwait: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user