diff --git a/.babelrc b/.babelrc index 1320b9a..0715456 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["@babel/preset-env"] + "presets": ["@babel/preset-env"], } diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..d24fdfc --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3ecd6b7..73407a3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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) - # 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/)). diff --git a/CONTRIBUTINGfr.md b/CONTRIBUTINGfr.md index 73907b2..46385e6 100644 --- a/CONTRIBUTINGfr.md +++ b/CONTRIBUTINGfr.md @@ -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) - # 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). diff --git a/CONTRIBUTINGpl.md b/CONTRIBUTINGpl.md index 4ef5e54..32b46f5 100644 --- a/CONTRIBUTINGpl.md +++ b/CONTRIBUTINGpl.md @@ -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) - # 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/)). diff --git a/CONTRIBUTINGru.md b/CONTRIBUTINGru.md index 6b1afd6..104c0bb 100644 --- a/CONTRIBUTINGru.md +++ b/CONTRIBUTINGru.md @@ -1,6 +1,5 @@ Прочитать на других языках: [English](CONTRIBUTING.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md) - # Добро пожаловать в руководство по внесению вклада Return YouTube Dislikes Благодарим вас за то, что вы потратили своё время на участие в нашем проекте! Все ваши изменения будут отражены в следующей версии расширения (или на [сайте](https://www.returnyoutubedislike.com/)). diff --git a/CONTRIBUTINGuk.md b/CONTRIBUTINGuk.md index 26b1677..f6d3279 100644 --- a/CONTRIBUTINGuk.md +++ b/CONTRIBUTINGuk.md @@ -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) - -# Вітаємо у посібнику внеску в Return YouTube Dislikes - -Дякуємо, що вкладаєте свій час у розвиток нашого проєкту! Усі ваші зміни буде відображено в наступній версії розширення (або ж [вебсайту](https://www.returnyoutubedislike.com/)). - -## Почнімо працювати - -Будь ласка, використовуйте Prettier із налаштуваннями за замовчуванням для форматування коду. - -#### Заздалегідь - -Вам потрібно встановити node і npm, щоб створити bundled версію джерела. - -Версії, що використовувались при налаштуванні: - -- node: 12.18.4 -- npm: 6.14.6 - -Для створення `bundled-content-script.js`, який містить більшу частину бізнес-логіки цього розширення, спочатку потрібно встановити всі залежності. - -1. Перейдіть в корінь репозиторію та виконайте наступне: - -``` -npm install -``` - -2. Виконайте наступну команду, щоб створити `bundled-content-script.js`, який використовується в `manifest.json` - -``` -npm start // для створення файлу(ів) збірки та запуску спостерігача за файлами, який виконує hot-reload при збереженні - -// або ж - -npm run build // для створення файлу(ів) збірки один раз -``` - -Вітаємо, тепер ви готові до розробки! - -Якщо ви новачок у розробці розширення Chrome або вам потрібна додаткова допомога, перегляньте [це керівництво на YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) (англ.) - -### Проблеми - -#### Відкриття нової проблеми - -Якщо у вас виникли проблеми з розширенням, здійсніть пошук і переконайтеся, що про цю проблему ще не повідомляли. Якщо ні, створіть Issue, використання форми проблеми наполегливо рекомендується, але не є обов’язковим. - -#### Вирішення проблеми - -Якщо ви знайшли проблему, і гадаєте, що можете її вирішити, не соромтеся. Створіть Pull Request на вилучення з виправленням і обов'язково вкажіть проблему, яку ви усуваєте. - -### Запит функції - -#### Відкриття запиту на нову функцію - -Якщо у вас є ідея щодо розширення, не соромтеся створіть Pull Request, але, будь ласка, здійсніть пошук і переконайтеся, що ця функція ще не запропонована. Використання форми функції наполегливо рекомендується, але не є обов’язковим. - -#### Реалізація запиту функції - -Якщо ви знайшли функцію, і гадаєте, що можете її реалізувати, не соромтеся. Створіть Pull Request із виправленням і обов’язково вкажіть функцію, яку ви впроваджуєте. - -### Які Pull Request ми приймаємо? - -- Виправлення проблем. -- Впровадження нових функцій. -- Виправлення помилок та спрощення тексту. -- Поліпшення сайту. \ No newline at end of file +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 + +Дякуємо, що вкладаєте свій час у розвиток нашого проєкту! Усі ваші зміни буде відображено в наступній версії розширення (або ж [вебсайту](https://www.returnyoutubedislike.com/)). + +## Почнімо працювати + +Будь ласка, використовуйте Prettier із налаштуваннями за замовчуванням для форматування коду. + +#### Заздалегідь + +Вам потрібно встановити node і npm, щоб створити bundled версію джерела. + +Версії, що використовувались при налаштуванні: + +- node: 12.18.4 +- npm: 6.14.6 + +Для створення `bundled-content-script.js`, який містить більшу частину бізнес-логіки цього розширення, спочатку потрібно встановити всі залежності. + +1. Перейдіть в корінь репозиторію та виконайте наступне: + +``` +npm install +``` + +2. Виконайте наступну команду, щоб створити `bundled-content-script.js`, який використовується в `manifest.json` + +``` +npm start // для створення файлу(ів) збірки та запуску спостерігача за файлами, який виконує hot-reload при збереженні + +// або ж + +npm run build // для створення файлу(ів) збірки один раз +``` + +Вітаємо, тепер ви готові до розробки! + +Якщо ви новачок у розробці розширення Chrome або вам потрібна додаткова допомога, перегляньте [це керівництво на YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) (англ.) + +### Проблеми + +#### Відкриття нової проблеми + +Якщо у вас виникли проблеми з розширенням, здійсніть пошук і переконайтеся, що про цю проблему ще не повідомляли. Якщо ні, створіть Issue, використання форми проблеми наполегливо рекомендується, але не є обов’язковим. + +#### Вирішення проблеми + +Якщо ви знайшли проблему, і гадаєте, що можете її вирішити, не соромтеся. Створіть Pull Request на вилучення з виправленням і обов'язково вкажіть проблему, яку ви усуваєте. + +### Запит функції + +#### Відкриття запиту на нову функцію + +Якщо у вас є ідея щодо розширення, не соромтеся створіть Pull Request, але, будь ласка, здійсніть пошук і переконайтеся, що ця функція ще не запропонована. Використання форми функції наполегливо рекомендується, але не є обов’язковим. + +#### Реалізація запиту функції + +Якщо ви знайшли функцію, і гадаєте, що можете її реалізувати, не соромтеся. Створіть Pull Request із виправленням і обов’язково вкажіть функцію, яку ви впроваджуєте. + +### Які Pull Request ми приймаємо? + +- Виправлення проблем. +- Впровадження нових функцій. +- Виправлення помилок та спрощення тексту. +- Поліпшення сайту. diff --git a/Docs/FAQ.md b/Docs/FAQ.md index ade89be..79368a6 100644 --- a/Docs/FAQ.md +++ b/Docs/FAQ.md @@ -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) - # Frequently Asked Questions ## Before asking a question on GitHub or Discord, please refer to this. diff --git a/Docs/FAQfr.md b/Docs/FAQfr.md index 131858c..14850bb 100644 --- a/Docs/FAQfr.md +++ b/Docs/FAQfr.md @@ -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) - # Foire Aux Questions ## Avant de poser une question sur GitHub ou Discord, veuillez vous référer à ceci. diff --git a/Docs/FAQpl.md b/Docs/FAQpl.md index e948262..ff63dd6 100644 --- a/Docs/FAQpl.md +++ b/Docs/FAQpl.md @@ -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 @@ -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** -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ć. diff --git a/Docs/FAQru.md b/Docs/FAQru.md index 422ca9d..ca21c1a 100644 --- a/Docs/FAQru.md +++ b/Docs/FAQru.md @@ -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, пожалуйста, ознакомьтесь с этим. ### **1. Откуда это расширение получает данные?** + Комбинация API Google и старых данных. Мы сохраняем все имеющиеся данные в нашей базе данных, чтобы они были доступны после того, как Google прекратит подсчёт отметок «Не нравится» в своём API. ### **2. Количество не понравившихся видео не обновляется** + В настоящее время видео с отметками «Не нравится» кэшируются и обновляются не очень часто. Раз в 2-3 дня, не чаще. Да, это не идеально, но это то, что есть. Мы работаем над тем, чтобы улучшить частоту их обновления. ### **3. Как это работает?** + Расширение собирает идентификатор видео, которое вы смотрите, извлекает данные об отметках «Не нравится» (и другие поля, такие как просмотры, отметки «Нравится» и т.д.) с помощью нашего API, если видео было извлечено нашим API впервые, оно использует YouTube API для получения данных, затем сохраняет данные в базе данных для кэширования (кэшируются около 2-3 дней) и архивирования и возвращает их вам. После этого расширение отображает отметки «Не нравится» вам. ### **4. Что произойдёт после того, как API YouTube перестанет возвращать данные о количестве отметок «Не нравится»?** + Внутренняя часть нашего сервера переключится на использование комбинации архивных статистик отметок «Не нравится», оценок, экстраполированных из данных о пользователях расширения, и оценок, основанных на соотношении просмотров и отметок «Нравится» для видео, чьи отметки «Не нравится» не были заархивированы, и для устаревших архивов с отметками «Не нравится». ## Я беспокоюсь о безопасности / конфиденциальности + Более подробную информацию смотрите на [этой странице](SECURITY-FAQ.md). diff --git a/Docs/FAQtr.md b/Docs/FAQtr.md index f731a98..173c6d4 100644 --- a/Docs/FAQtr.md +++ b/Docs/FAQtr.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) - # Sıkça Sorulan Sorular ## GitHub'da veya Discord'da bir soru sormadan önce, lütfen buraya göz atın. diff --git a/Docs/FAQuk.md b/Docs/FAQuk.md index 0c4812a..e772876 100644 --- a/Docs/FAQuk.md +++ b/Docs/FAQuk.md @@ -1,61 +1,61 @@ -Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md) - -# Часті питання - -## Перш ніж задавати питання на GitHub або у Discord, будь ласка, ознайомтеся з цим. - -
- -### **1. Звідки це розширення отримує дані?** - -Комбінація Google API та старих даних. - -Ми зберігаємо всі доступні дані в нашій базі, аби вони були доступні після того, як Google вимкне лічильник відміток «Не подобається» у своєму API. - -
- -### **2. Лічильник «Не подобається» не оновлюється** - -Наразі відео з відмітками «Не подобається» кешуються і оновлюються не надто часто. Не частіше, ніж раз в 2-3 дні. - -Так, це не ідеально, але маємо те, що маємо. Ми працюємо над тим, щоб збільшити частоту їх оновлення. - -
- -### **3. Як це працює?** - -Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API, якщо відео було витягнуте нашим API вперше, воно використовує YouTube API для отримання даних, потім зберігає дані в базі даних для кешування (кешуються близько 2-3 днів) та архівування й повертає їх вам. Після цього розширення відображає відмітки «Не подобається» вам. - -
- -### **4. Що станеться після того, як YouTube API перестане повертати кількість відміток «Не подобається»?** - -Сервер перейде на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними . - -
- -### **5. Як розраховується кількість відміток «Не подобається»?** - -RYD використовує відмітки своїх користувачів, щоб екстраполювати кількість відміток «Не подобається». - -- Якщо відео було завантажено після вимкнення API: - - $$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Подобається» серед користувачів RYD}}{\textup{К-ть відміток «Не подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$ - -- Якщо база даних RYD якимось чином мала фактичну кількість відміток «Подобається» та «Не подобається» (надану завантажувачем або з архіву), кількість відміток «Не подобається» буде розраховано на основі відміток користувачів і архівного значення. Архівне значення матиме менший вплив на остаточний підрахунок у міру актуальності. - -
- ---- - -Це все, але у відео форматі - -[![IReturn YouTube Dislike Explained](https://yt-embed.herokuapp.com/embed?v=GSmmtv-0yYQ)](https://www.youtube.com/watch?v=GSmmtv-0yYQ) - ---- - -
- -## Я турбуюся про безпеку/конфіденційність - -Детальніше про це дивіться [тут](SECURITY-FAQuk.md). \ No newline at end of file +Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md) + +# Часті питання + +## Перш ніж задавати питання на GitHub або у Discord, будь ласка, ознайомтеся з цим. + +
+ +### **1. Звідки це розширення отримує дані?** + +Комбінація Google API та старих даних. + +Ми зберігаємо всі доступні дані в нашій базі, аби вони були доступні після того, як Google вимкне лічильник відміток «Не подобається» у своєму API. + +
+ +### **2. Лічильник «Не подобається» не оновлюється** + +Наразі відео з відмітками «Не подобається» кешуються і оновлюються не надто часто. Не частіше, ніж раз в 2-3 дні. + +Так, це не ідеально, але маємо те, що маємо. Ми працюємо над тим, щоб збільшити частоту їх оновлення. + +
+ +### **3. Як це працює?** + +Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API, якщо відео було витягнуте нашим API вперше, воно використовує YouTube API для отримання даних, потім зберігає дані в базі даних для кешування (кешуються близько 2-3 днів) та архівування й повертає їх вам. Після цього розширення відображає відмітки «Не подобається» вам. + +
+ +### **4. Що станеться після того, як YouTube API перестане повертати кількість відміток «Не подобається»?** + +Сервер перейде на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними . + +
+ +### **5. Як розраховується кількість відміток «Не подобається»?** + +RYD використовує відмітки своїх користувачів, щоб екстраполювати кількість відміток «Не подобається». + +- Якщо відео було завантажено після вимкнення API: + + $$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Подобається» серед користувачів RYD}}{\textup{К-ть відміток «Не подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$ + +- Якщо база даних RYD якимось чином мала фактичну кількість відміток «Подобається» та «Не подобається» (надану завантажувачем або з архіву), кількість відміток «Не подобається» буде розраховано на основі відміток користувачів і архівного значення. Архівне значення матиме менший вплив на остаточний підрахунок у міру актуальності. + +
+ +--- + +Це все, але у відео форматі + +[![IReturn YouTube Dislike Explained](https://yt-embed.herokuapp.com/embed?v=GSmmtv-0yYQ)](https://www.youtube.com/watch?v=GSmmtv-0yYQ) + +--- + +
+ +## Я турбуюся про безпеку/конфіденційність + +Детальніше про це дивіться [тут](SECURITY-FAQuk.md). diff --git a/Docs/SECURITY-FAQ.md b/Docs/SECURITY-FAQ.md index 6caadbb..c98d330 100644 --- a/Docs/SECURITY-FAQ.md +++ b/Docs/SECURITY-FAQ.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) - # Security ### Are you tracking my viewing history? diff --git a/Docs/SECURITY-FAQnl.md b/Docs/SECURITY-FAQnl.md index 034f1c8..ca51aa4 100644 --- a/Docs/SECURITY-FAQnl.md +++ b/Docs/SECURITY-FAQnl.md @@ -4,27 +4,27 @@ Lees dit in andere talen: [English](SECURITY_FAQ.md), [русский](SECURITY- ### 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 -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 -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 +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 +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 +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. ### 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 -Google-account. Dit wordt gedaan om botting te voorkomen. Maar er is geen manier om deze willekeurige id aan jou of 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 persoonlijke YouTube-account te koppelen. ### 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. ### 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 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? -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. \ No newline at end of file +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. diff --git a/Docs/SECURITY-FAQpl.md b/Docs/SECURITY-FAQpl.md index b77960e..cd7bd1a 100644 --- a/Docs/SECURITY-FAQpl.md +++ b/Docs/SECURITY-FAQpl.md @@ -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) - # Security ### Czy śledzicie moją historię wyświetleń? diff --git a/Docs/SECURITY-FAQtr.md b/Docs/SECURITY-FAQtr.md index 3830c0e..d7560be 100644 --- a/Docs/SECURITY-FAQtr.md +++ b/Docs/SECURITY-FAQtr.md @@ -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 diff --git a/Docs/SECURITY-FAQuk.md b/Docs/SECURITY-FAQuk.md index 64545d6..91fb80e 100644 --- a/Docs/SECURITY-FAQuk.md +++ b/Docs/SECURITY-FAQuk.md @@ -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) - -# Безпека - -### Ви відстежуєте мою історію переглядів? - -Ні. Код розширення знаходиться у відкритому доступі, і ви можете ознайомитись з ним самостійно. Єдина інформація, що передається - це ID відео, який необхідний для отримання даних про кількість відміток. Жодних додаткових заголовків не передається. На комунікаційному рівні серверу буде передано вашу публічну IP-адресу, а також час, коли було зроблено запит. Однак ніщо з цього ніяк не здатно вас ідентифіквати. Припускаючи середовище з нульовою довірою, найцінніше, що ми можемо отримати це динамічний IP. Який сьогодні ваш, а завтра – вашого сусіда. Якщо ви дійсно турбуєтеся про те, що ваш IP може бути відстежений, ви, ймовірно, вже використовуєте якийсь VPN. - -### Чи можете ви однозначно ідентифікувати мене, коли я залишаю відмітку «Не подобається»? - -Так. Коли ви залишаєте відео позначку «Не подобається», ми створюємо для вас випадковий унікальний ID, який не прив'язаний до вашого облікового запису Google. Це робиться для уникнення атаки ботів. Але немає жодного способу зв'язати цей випадковий ID до вас або вашого особистого облікового запису YouTube. - -### Якою саме інформацією ви володієте? - -Лише ID відео. Ні ваших коментарів, ні вашого імені користувача, ні того, з ким ви поділилися відео, ні будь-яких інших додаткових метаданих. Нічого. Лише ID відео. - -### Як зберігається моя IP-адреса? - -Внутрішня частина нашого сервера зберігає нехешовані IP-адреси лише в енергозалежній пам'яті (ОЗП). Ці адреси не зберігаються на жорсткому диску і тому ніде не записані. Ми хешуємо IP-адреси, і вони зберігаються замість інших. Це зроблено для запобігання вандалізму у базі даних. - -### Я чув дискусію щодо 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) надбезпечний. Ви зможете відкликати доступ до свого облікового запису в будь-яку мить, і зможете дати нам обмежені дозволи. Ми не будемо вимагати жодних дозволів, крім необжідних. Ми будемо вимагати лише дозволи перегляду статистики ваших відео. - -### Наскільки достовірна ця кількость відміток «Не подобається»? - -Ми вжили заходів щодо запобігання атакам ботів і збираємося продовжувати працювати над підвищенням ефективності цієї сисеми надалі: це допоможе нам зберегти підрахунок відміток «Не подобається» як хороше представлення фактичної кількості. Звичайно, він ніколи не буде точним на всі 100%, тож ви самі вирішуєте, довіряти йому чи ні. - -### Чому б вам не поділитися внутрішнім кодом вашого сервера? - -Ми поділимося ним у якийсь момент – але зараз немає жодних причин це робити. Це дасть хибне почуття безпеки - адже в системі з нульовою довірою ми можемо з таким самим успіхом поділитися однією версією, але розгорнути іншу. Є багато причин тримати код у таємниці, зокрема, як ми боремося зі спамом. Приховування та затьмарення коду обробки спаму є доволі стандартною практикою. \ No newline at end of file +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, який не прив'язаний до вашого облікового запису Google. Це робиться для уникнення атаки ботів. Але немає жодного способу зв'язати цей випадковий ID до вас або вашого особистого облікового запису YouTube. + +### Якою саме інформацією ви володієте? + +Лише ID відео. Ні ваших коментарів, ні вашого імені користувача, ні того, з ким ви поділилися відео, ні будь-яких інших додаткових метаданих. Нічого. Лише ID відео. + +### Як зберігається моя IP-адреса? + +Внутрішня частина нашого сервера зберігає нехешовані IP-адреси лише в енергозалежній пам'яті (ОЗП). Ці адреси не зберігаються на жорсткому диску і тому ніде не записані. Ми хешуємо IP-адреси, і вони зберігаються замість інших. Це зроблено для запобігання вандалізму у базі даних. + +### Я чув дискусію щодо 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) надбезпечний. Ви зможете відкликати доступ до свого облікового запису в будь-яку мить, і зможете дати нам обмежені дозволи. Ми не будемо вимагати жодних дозволів, крім необжідних. Ми будемо вимагати лише дозволи перегляду статистики ваших відео. + +### Наскільки достовірна ця кількость відміток «Не подобається»? + +Ми вжили заходів щодо запобігання атакам ботів і збираємося продовжувати працювати над підвищенням ефективності цієї сисеми надалі: це допоможе нам зберегти підрахунок відміток «Не подобається» як хороше представлення фактичної кількості. Звичайно, він ніколи не буде точним на всі 100%, тож ви самі вирішуєте, довіряти йому чи ні. + +### Чому б вам не поділитися внутрішнім кодом вашого сервера? + +Ми поділимося ним у якийсь момент – але зараз немає жодних причин це робити. Це дасть хибне почуття безпеки - адже в системі з нульовою довірою ми можемо з таким самим успіхом поділитися однією версією, але розгорнути іншу. Є багато причин тримати код у таємниці, зокрема, як ми боремося зі спамом. Приховування та затьмарення коду обробки спаму є доволі стандартною практикою. diff --git a/Extensions/UserScript/Return Youtube Dislike.user.js b/Extensions/UserScript/Return Youtube Dislike.user.js index abd1589..50edc4d 100644 --- a/Extensions/UserScript/Return Youtube Dislike.user.js +++ b/Extensions/UserScript/Return Youtube Dislike.user.js @@ -35,7 +35,7 @@ const extConfig = { 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. 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 }; @@ -75,7 +75,7 @@ function getButtons() { let elements = document.querySelectorAll( isMobile ? "ytm-like-button-renderer" - : "#like-button > ytd-like-button-renderer" + : "#like-button > ytd-like-button-renderer", ); for (let element of elements) { if (isInViewport(element)) { @@ -85,14 +85,17 @@ function getButtons() { } if (isMobile) { return ( - document.querySelector(".slim-video-action-bar-actions .segmented-buttons") ?? - document.querySelector(".slim-video-action-bar-actions") + document.querySelector( + ".slim-video-action-bar-actions .segmented-buttons", + ) ?? document.querySelector(".slim-video-action-bar-actions") ); } if (document.getElementById("menu-container")?.offsetParent === null) { return ( 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 { return document @@ -102,17 +105,22 @@ function getButtons() { } function getDislikeButton() { - if (getButtons().children[0].tagName === - "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER") - { + if ( + getButtons().children[0].tagName === + "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER" + ) { if (getButtons().children[0].children[1] === undefined) { return document.querySelector("#segmented-dislike-button"); } else { return getButtons().children[0].children[1]; } } else { - if (getButtons().querySelector("segmented-like-dislike-button-view-model")) { - const dislikeViewModel = getButtons().querySelector("dislike-button-view-model"); + if ( + 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..."); return dislikeViewModel; } else { @@ -123,9 +131,12 @@ function getDislikeButton() { function getLikeButton() { return getButtons().children[0].tagName === - "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER" - ? document.querySelector("#segmented-like-button") !== null ? document.querySelector("#segmented-like-button") : getButtons().children[0].children[0] - : getButtons().querySelector("like-button-view-model") ?? getButtons().children[0]; + "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER" + ? document.querySelector("#segmented-like-button") !== null + ? document.querySelector("#segmented-like-button") + : getButtons().children[0].children[0] + : getButtons().querySelector("like-button-view-model") ?? + getButtons().children[0]; } function getLikeTextContainer() { @@ -136,19 +147,19 @@ function getLikeTextContainer() { ); } - function getDislikeTextContainer() { const dislikeButton = getDislikeButton(); let result = dislikeButton?.querySelector("#text") ?? dislikeButton?.getElementsByTagName("yt-formatted-string")[0] ?? - dislikeButton?.querySelector("span[role='text']") + dislikeButton?.querySelector("span[role='text']"); if (result === null) { let textSpan = document.createElement("span"); textSpan.id = "text"; textSpan.style.marginLeft = "6px"; dislikeButton?.querySelector("button").appendChild(textSpan); - if (dislikeButton) dislikeButton.querySelector("button").style.width = "auto"; + if (dislikeButton) + dislikeButton.querySelector("button").style.width = "auto"; result = textSpan; } return result; @@ -158,8 +169,12 @@ function createObserver(options, callback) { const observerWrapper = new Object(); observerWrapper.options = options; observerWrapper.observer = new MutationObserver(callback); - observerWrapper.observe = function (element) { this.observer.observe(element, this.options); } - observerWrapper.disconnect = function () { this.observer.disconnect(); } + observerWrapper.observe = function (element) { + this.observer.observe(element, this.options); + }; + observerWrapper.disconnect = function () { + this.observer.disconnect(); + }; return observerWrapper; } @@ -167,31 +182,36 @@ let shortsObserver = null; if (isShorts() && !shortsObserver) { cLog("Initializing shorts mutation observer"); - shortsObserver = createObserver({ - attributes: true - }, (mutationList) => { - mutationList.forEach((mutation) => { - if ( - mutation.type === "attributes" && - mutation.target.nodeName === "TP-YT-PAPER-BUTTON" && - mutation.target.id === "button" - ) { - cLog("Short thumb button status changed"); - if (mutation.target.getAttribute("aria-pressed") === "true") { - mutation.target.style.color = - mutation.target.parentElement.parentElement.id === "like-button" - ? getColorFromTheme(true) - : getColorFromTheme(false); - } else { - mutation.target.style.color = "unset"; + shortsObserver = createObserver( + { + attributes: true, + }, + (mutationList) => { + mutationList.forEach((mutation) => { + if ( + mutation.type === "attributes" && + mutation.target.nodeName === "TP-YT-PAPER-BUTTON" && + mutation.target.id === "button" + ) { + cLog("Short thumb button status changed"); + if (mutation.target.getAttribute("aria-pressed") === "true") { + mutation.target.style.color = + mutation.target.parentElement.parentElement.id === "like-button" + ? getColorFromTheme(true) + : getColorFromTheme(false); + } else { + mutation.target.style.color = "unset"; + } + return; } - return; - } - cLog( - "Unexpected mutation observer event: " + mutation.target + mutation.type - ); - }); - }); + cLog( + "Unexpected mutation observer event: " + + mutation.target + + mutation.type, + ); + }); + }, + ); } function isVideoLiked() { @@ -263,7 +283,7 @@ function setDislikes(dislikesCount) { mobileDislikes = dislikesCount; return; } - getDislikeTextContainer()?.removeAttribute('is-empty'); + getDislikeTextContainer()?.removeAttribute("is-empty"); 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. return false; } - let likeButton = getLikeButton() - .querySelector("yt-formatted-string#text") ?? - getLikeButton().querySelector("button"); + let likeButton = + getLikeButton().querySelector("yt-formatted-string#text") ?? + getLikeButton().querySelector("button"); - let likesStr = likeButton.getAttribute("aria-label") - .replace(/\D/g, ""); + let likesStr = likeButton.getAttribute("aria-label").replace(/\D/g, ""); return likesStr.length > 0 ? parseInt(likesStr) : false; - } - catch { + } catch { return false; } - } (typeof GM_addStyle != "undefined" @@ -339,8 +356,7 @@ function createRateBar(likes, dislikes) { let rateBar = document.getElementById("return-youtube-dislike-bar-container"); const widthPx = - getLikeButton().clientWidth + - (getDislikeButton()?.clientWidth ?? 52); + getLikeButton().clientWidth + (getDislikeButton()?.clientWidth ?? 52); const widthPercent = likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50; @@ -397,25 +413,23 @@ function createRateBar(likes, dislikes) { ${tooltipInnerHTML} -` +`, ); let descriptionAndActionsElement = document.getElementById("top-row"); descriptionAndActionsElement.style.borderBottom = "1px solid var(--yt-spec-10-percent-layer)"; descriptionAndActionsElement.style.paddingBottom = "10px"; } else { - document.querySelector( - ".ryd-tooltip" - ).style.width = widthPx + "px"; + document.querySelector(".ryd-tooltip").style.width = widthPx + "px"; document.getElementById("return-youtube-dislike-bar").style.width = widthPercent + "%"; if (extConfig.coloredBar) { document.getElementById( - "return-youtube-dislike-bar-container" + "return-youtube-dislike-bar-container", ).style.backgroundColor = getColorFromTheme(false); document.getElementById( - "return-youtube-dislike-bar" + "return-youtube-dislike-bar", ).style.backgroundColor = getColorFromTheme(true); } } @@ -426,7 +440,7 @@ function setState() { let statsSet = false; fetch( - `https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}` + `https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}`, ).then((response) => { response.json().then((json) => { if (json && !("traceId" in response) && !statsSet) { @@ -447,24 +461,26 @@ function setState() { if (isShorts()) { // for shorts, leave deactived buttons in default color const shortLikeButton = getLikeButton().querySelector( - "tp-yt-paper-button#button" + "tp-yt-paper-button#button", ); const shortDislikeButton = dislikeButton?.querySelector( - "tp-yt-paper-button#button" + "tp-yt-paper-button#button", ); if (shortLikeButton.getAttribute("aria-pressed") === "true") { shortLikeButton.style.color = getColorFromTheme(true); } - if (shortDislikeButton && - shortDislikeButton.getAttribute("aria-pressed") === "true") - { + if ( + shortDislikeButton && + shortDislikeButton.getAttribute("aria-pressed") === "true" + ) { shortDislikeButton.style.color = getColorFromTheme(false); } shortsObserver.observe(shortLikeButton); shortsObserver.observe(shortDislikeButton); } else { 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); } return getNumberFormatter(extConfig.numberDisplayFormat).format( - numberDisplay + numberDisplay, ); } @@ -586,11 +602,11 @@ function getNumberFormatter(optionSelect) { userLocales = new URL( Array.from(document.querySelectorAll("head > link[rel='search']")) ?.find((n) => n?.getAttribute("href")?.includes("?locale=")) - ?.getAttribute("href") + ?.getAttribute("href"), )?.searchParams?.get("locale"); } catch { 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"; } @@ -671,17 +687,22 @@ function setEventListeners(evt) { preNavigateLikeButton = getLikeButton(); if (!smartimationObserver) { - smartimationObserver = createObserver({ - attributes: true, - subtree: true - }, updateDOMDislikes); + smartimationObserver = createObserver( + { + attributes: true, + subtree: true, + }, + updateDOMDislikes, + ); smartimationObserver.container = null; } - const smartimationContainer = buttons.querySelector('yt-smartimation'); - if (smartimationContainer && - smartimationObserver.container != smartimationContainer) - { + const smartimationContainer = + buttons.querySelector("yt-smartimation"); + if ( + smartimationContainer && + smartimationObserver.container != smartimationContainer + ) { cLog("Initializing smartimation mutation observer"); smartimationObserver.disconnect(); smartimationObserver.observe(smartimationContainer); @@ -716,12 +737,12 @@ if (isMobile) { }; setInterval(() => { const dislikeButton = getDislikeButton(); - if(dislikeButton?.querySelector(".button-renderer-text") === null){ + if (dislikeButton?.querySelector(".button-renderer-text") === null) { getDislikeTextContainer().innerText = mobileDislikes; - } - else{ - if (dislikeButton) dislikeButton.querySelector(".button-renderer-text").innerText = - mobileDislikes; + } else { + if (dislikeButton) + dislikeButton.querySelector(".button-renderer-text").innerText = + mobileDislikes; } }, 1000); } diff --git a/Extensions/combined/_locales/nl/messages.json b/Extensions/combined/_locales/nl/messages.json index a7f04f6..99af271 100644 --- a/Extensions/combined/_locales/nl/messages.json +++ b/Extensions/combined/_locales/nl/messages.json @@ -1,134 +1,134 @@ { - "extensionName": { - "message": "Return YouTube Dislike" - }, - "extensionNameBeta": { - "message": "Return YouTube Dislike Beta" - }, - "extensionDesc": { - "message": "Retourneert het vermogen om dislikes te zien" - }, - "textDeveloper": { - "message": "door Dmitry Selivanov & Gemeenschap" - }, - "linkWebsite": { - "message": "Website" - }, - "linkFAQ": { - "message": "FAQ" - }, - "linkDonate": { - "message": "Doneer" - }, - "linkHelp": { - "message": "Help" - }, - "linkChangelog": { - "message": "Wijzig-log" - }, - "legendSettings": { - "message": "Instellingen" - }, - "textSettings": { - "message": "Inzending voor leuk/niet leuk uitschakelen" - }, - "textLikesDisabled": { - "message": "Uitgeschakeld door eigenaar" - }, - "textSettingsHover": { - "message": "Stopt met het tellen van je leuks en niet leuks" - }, - "textRoundingNumbers": { - "message": "Statistieken voor leuk/niet leuk naar beneden afronden (standaard YouTube-gedrag)" - }, - "textRoundingNumbersHover": { - "message": "Afgeronde statistieken weergeven." - }, - "textConsistentFormat": { - "message": "Maak het formaat voor likes en dislikes consistent" - }, - "textConsistentFormatHover": { - "message": "Herformatteer als getallen." - }, - "textNumberFormat": { - "message": "Nummer formaat:" - }, - "textColorizeRatioBar": { - "message": "Verhoudingsbalk inkleuren" - }, - "textColorizeRatioBarHover": { - "message": "Gebruik aangepaste kleuren voor de verhoudingsbalk." - }, - "textColorizeThumbs": { - "message": "Duimen inkleuren" - }, - "textColorizeThumbsHover": { - "message": "Gebruik aangepaste kleuren voor duimpictogrammen." - }, - "textColorTheme": { - "message": "Kleuren thema:" - }, - "textColorTheme1": { - "message": "Klassiek" - }, - "textColorTheme2": { - "message": "Beschikbaar" - }, - "textColorTheme3": { - "message": "Neon" - }, - "textTempUnavailable": { - "message": "Tijdelijk niet beschikbaar" - }, - "textUpdate": { - "message": "Update naar" - }, - "version30installed": { - "message": "Versie 3.0.0.13 geïnstalleerd" - }, - "whatsnew": { - "message": "Wat is er nieuw" - }, - "shortsSupport": { - "message": "YouTube Shorts Ondersteuning" - }, - "customColors": { - "message": "Aangepaste kleuren voor afkeerbalk en knoppen" - }, - "customNumberFormats": { - "message": "Aangepaste getalnotaties" - }, - "considerDonating": { - "message": "Het enige dat de extensie draaiende houdt, zijn uw donaties, overweeg alstublieft om het project te steunen." - }, - "roundNumbers": { - "message": "Afgeronde getallen weergeven" - }, - "roundNumbersHover": { - "message": "Rond getallen naar beneden af (standaard YouTube-gedrag)." - }, - "reformatLikes": { - "message": "Opnieuw formatteren zoals getallen" - }, - "reformatLikesHover": { - "message": "Maak het formaat voor leuk en niet leuk consistent." - }, - "numberFormat": { - "message": "Nummer formaat:" - }, - "colorizeRatio": { - "message": "Verhoudingsbalk inkleuren" - }, - "colorizeRatioHover": { - "message": "Gebruik aangepaste kleuren voor de verhoudingsbalk." - }, - "colorizeThumbs": { - "message": "Duimen inkleuren" - }, - "colorizeThumbsHover": { - "message": "Gebruik aangepaste kleuren voor de duimpictogrammen." - }, - "colorTheme": { - "message": "Kleuren thema:" - } + "extensionName": { + "message": "Return YouTube Dislike" + }, + "extensionNameBeta": { + "message": "Return YouTube Dislike Beta" + }, + "extensionDesc": { + "message": "Retourneert het vermogen om dislikes te zien" + }, + "textDeveloper": { + "message": "door Dmitry Selivanov & Gemeenschap" + }, + "linkWebsite": { + "message": "Website" + }, + "linkFAQ": { + "message": "FAQ" + }, + "linkDonate": { + "message": "Doneer" + }, + "linkHelp": { + "message": "Help" + }, + "linkChangelog": { + "message": "Wijzig-log" + }, + "legendSettings": { + "message": "Instellingen" + }, + "textSettings": { + "message": "Inzending voor leuk/niet leuk uitschakelen" + }, + "textLikesDisabled": { + "message": "Uitgeschakeld door eigenaar" + }, + "textSettingsHover": { + "message": "Stopt met het tellen van je leuks en niet leuks" + }, + "textRoundingNumbers": { + "message": "Statistieken voor leuk/niet leuk naar beneden afronden (standaard YouTube-gedrag)" + }, + "textRoundingNumbersHover": { + "message": "Afgeronde statistieken weergeven." + }, + "textConsistentFormat": { + "message": "Maak het formaat voor likes en dislikes consistent" + }, + "textConsistentFormatHover": { + "message": "Herformatteer als getallen." + }, + "textNumberFormat": { + "message": "Nummer formaat:" + }, + "textColorizeRatioBar": { + "message": "Verhoudingsbalk inkleuren" + }, + "textColorizeRatioBarHover": { + "message": "Gebruik aangepaste kleuren voor de verhoudingsbalk." + }, + "textColorizeThumbs": { + "message": "Duimen inkleuren" + }, + "textColorizeThumbsHover": { + "message": "Gebruik aangepaste kleuren voor duimpictogrammen." + }, + "textColorTheme": { + "message": "Kleuren thema:" + }, + "textColorTheme1": { + "message": "Klassiek" + }, + "textColorTheme2": { + "message": "Beschikbaar" + }, + "textColorTheme3": { + "message": "Neon" + }, + "textTempUnavailable": { + "message": "Tijdelijk niet beschikbaar" + }, + "textUpdate": { + "message": "Update naar" + }, + "version30installed": { + "message": "Versie 3.0.0.13 geïnstalleerd" + }, + "whatsnew": { + "message": "Wat is er nieuw" + }, + "shortsSupport": { + "message": "YouTube Shorts Ondersteuning" + }, + "customColors": { + "message": "Aangepaste kleuren voor afkeerbalk en knoppen" + }, + "customNumberFormats": { + "message": "Aangepaste getalnotaties" + }, + "considerDonating": { + "message": "Het enige dat de extensie draaiende houdt, zijn uw donaties, overweeg alstublieft om het project te steunen." + }, + "roundNumbers": { + "message": "Afgeronde getallen weergeven" + }, + "roundNumbersHover": { + "message": "Rond getallen naar beneden af (standaard YouTube-gedrag)." + }, + "reformatLikes": { + "message": "Opnieuw formatteren zoals getallen" + }, + "reformatLikesHover": { + "message": "Maak het formaat voor leuk en niet leuk consistent." + }, + "numberFormat": { + "message": "Nummer formaat:" + }, + "colorizeRatio": { + "message": "Verhoudingsbalk inkleuren" + }, + "colorizeRatioHover": { + "message": "Gebruik aangepaste kleuren voor de verhoudingsbalk." + }, + "colorizeThumbs": { + "message": "Duimen inkleuren" + }, + "colorizeThumbsHover": { + "message": "Gebruik aangepaste kleuren voor de duimpictogrammen." + }, + "colorTheme": { + "message": "Kleuren thema:" } +} diff --git a/Extensions/combined/changelog/3/changelog_3.0.html b/Extensions/combined/changelog/3/changelog_3.0.html index 4ffe4bc..f127845 100644 --- a/Extensions/combined/changelog/3/changelog_3.0.html +++ b/Extensions/combined/changelog/3/changelog_3.0.html @@ -1,4 +1,4 @@ - + diff --git a/Extensions/combined/manifest-chrome.json b/Extensions/combined/manifest-chrome.json index 9dc609c..8981d1f 100644 --- a/Extensions/combined/manifest-chrome.json +++ b/Extensions/combined/manifest-chrome.json @@ -2,7 +2,7 @@ "name": "__MSG_extensionName__", "description": "__MSG_extensionDesc__", "default_locale": "en", - "version": "3.0.0.12", + "version": "3.0.0.14", "manifest_version": 3, "background": { "service_worker": "ryd.background.js" diff --git a/Extensions/combined/manifest-firefox.json b/Extensions/combined/manifest-firefox.json index 7f0fb23..31bf1b2 100644 --- a/Extensions/combined/manifest-firefox.json +++ b/Extensions/combined/manifest-firefox.json @@ -2,7 +2,7 @@ "name": "__MSG_extensionName__", "description": "__MSG_extensionDesc__", "default_locale": "en", - "version": "3.0.0.12", + "version": "3.0.0.14", "manifest_version": 2, "background": { "scripts": ["ryd.background.js"] @@ -34,10 +34,10 @@ "open_in_tab": false } // uncomment this section for local storage to work in firefox locally - // "browser_specific_settings": { - // "gecko": { - // "id": "addon@example.com", - // "strict_min_version": "42.0" + // ,"browser_specific_settings": { + // "gecko": { + // "id": "addon@example.com", + // "strict_min_version": "42.0" + // } // } - // } } diff --git a/Extensions/combined/popup.css b/Extensions/combined/popup.css index a5cdb7b..90e3cf6 100644 --- a/Extensions/combined/popup.css +++ b/Extensions/combined/popup.css @@ -74,7 +74,9 @@ button:hover { content: attr(data-hover); visibility: hidden; opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; + transition: + visibility 0.1s linear, + opacity 0.1s linear; width: 250px; background-color: var(--secondary); border-radius: 0.5rem; diff --git a/Extensions/combined/popup.html b/Extensions/combined/popup.html index 9bf53cd..537b061 100644 --- a/Extensions/combined/popup.html +++ b/Extensions/combined/popup.html @@ -1,4 +1,4 @@ - + diff --git a/Extensions/combined/popup.js b/Extensions/combined/popup.js index 1c7a832..09be930 100644 --- a/Extensions/combined/popup.js +++ b/Extensions/combined/popup.js @@ -80,7 +80,6 @@ document.getElementById("color_theme").addEventListener("click", (ev) => { chrome.storage.sync.set({ colorTheme: ev.target.value }); }); - document.getElementById("number_format").addEventListener("change", (ev) => { chrome.storage.sync.set({ numberDisplayFormat: ev.target.value }); }); @@ -140,7 +139,7 @@ function initializeVersionNumber() { document.getElementById("ext-version").innerHTML = "v" + version; 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((json) => { @@ -197,7 +196,6 @@ function initializeColorTheme() { }); } - function initializeTooltipPercentage() { chrome.storage.sync.get(["showTooltipPercentage"], (res) => { handleShowTooltipPercentageChangeEvent(res.showTooltipPercentage); @@ -238,7 +236,7 @@ chrome.storage.onChanged.addListener(storageChangeHandler); function storageChangeHandler(changes, area) { if (changes.disableVoteSubmission !== undefined) { handleDisableVoteSubmissionChangeEvent( - changes.disableVoteSubmission.newValue + changes.disableVoteSubmission.newValue, ); } if (changes.coloredThumbs !== undefined) { @@ -255,12 +253,12 @@ function storageChangeHandler(changes, area) { } if (changes.showTooltipPercentage !== undefined) { handleShowTooltipPercentageChangeEvent( - changes.showTooltipPercentage.newValue + changes.showTooltipPercentage.newValue, ); } if (changes.numberDisplayReformatLikes !== undefined) { handleNumberDisplayReformatLikesChangeEvent( - changes.numberDisplayReformatLikes.newValue + changes.numberDisplayReformatLikes.newValue, ); } } @@ -298,8 +296,6 @@ function updateColorThemePreviewContent(themeName) { getColorFromTheme(themeName, false); } - - function handleNumberDisplayFormatChangeEvent(value) { config.numberDisplayFormat = value; document @@ -336,7 +332,7 @@ function getNumberFormatter(optionSelect) { userLocales = new URL( Array.from(document.querySelectorAll("head > link[rel='search']")) ?.find((n) => n?.getAttribute("href")?.includes("?locale=")) - ?.getAttribute("href") + ?.getAttribute("href"), )?.searchParams?.get("locale"); } catch {} @@ -359,7 +355,7 @@ function getNumberFormatter(optionSelect) { { notation: formatterNotation, compactDisplay: formatterCompactDisplay, - } + }, ); return formatter; } @@ -368,7 +364,7 @@ function getNumberFormatter(optionSelect) { let status = document.getElementById("status"); let serverStatus = document.getElementById("server-status"); let resp = await fetch( - "https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g" + "https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g", ); let result = await resp.status; if (result === 200) { diff --git a/Extensions/combined/ryd.background.js b/Extensions/combined/ryd.background.js index cc2817c..d9ddb2d 100644 --- a/Extensions/combined/ryd.background.js +++ b/Extensions/combined/ryd.background.js @@ -40,7 +40,7 @@ api.runtime.onMessage.addListener((request, sender, sendResponse) => { headers: { Accept: "application/json", }, - } + }, ) .then((response) => response.json()) .then((response) => { @@ -153,7 +153,7 @@ async function register() { headers: { Accept: "application/json", }, - } + }, ).then((response) => response.json()); const solvedPuzzle = await solvePuzzle(registrationResponse); if (!solvedPuzzle.solution) { @@ -210,7 +210,7 @@ function countLeadingZeroes(uInt8View, limit) { async function solvePuzzle(puzzle) { let challenge = Uint8Array.from(atob(puzzle.challenge), (c) => - c.charCodeAt(0) + c.charCodeAt(0), ); let buffer = new ArrayBuffer(20); let uInt8View = new Uint8Array(buffer); @@ -255,7 +255,7 @@ function generateUserID(length = 36) { function storageChangeHandler(changes, area) { if (changes.disableVoteSubmission !== undefined) { handleDisableVoteSubmissionChangeEvent( - changes.disableVoteSubmission.newValue + changes.disableVoteSubmission.newValue, ); } if (changes.coloredThumbs !== undefined) { @@ -272,17 +272,17 @@ function storageChangeHandler(changes, area) { } if (changes.numberDisplayReformatLikes !== undefined) { handleNumberDisplayReformatLikesChangeEvent( - changes.numberDisplayReformatLikes.newValue + changes.numberDisplayReformatLikes.newValue, ); } if (changes.showTooltipPercentage !== undefined) { handleShowTooltipPercentageChangeEvent( - changes.showTooltipPercentage.newValue + changes.showTooltipPercentage.newValue, ); } if (changes.numberDisplayReformatLikes !== undefined) { handleNumberDisplayReformatLikesChangeEvent( - changes.numberDisplayReformatLikes.newValue + changes.numberDisplayReformatLikes.newValue, ); } } diff --git a/Extensions/combined/ryd.content-script.js b/Extensions/combined/ryd.content-script.js index 6c5a301..5830383 100644 --- a/Extensions/combined/ryd.content-script.js +++ b/Extensions/combined/ryd.content-script.js @@ -1,24 +1,11 @@ //--- Import Button Functions ---// -import { - getButtons, - - - -} from "./src/buttons"; +import { getButtons } from "./src/buttons"; //--- Import State Functions ---// -import { - isShorts, - setInitialState, - initExtConfig, -} from "./src/state"; +import { isShorts, setInitialState, initExtConfig } from "./src/state"; //--- Import Video & Browser Functions ---// -import { - getBrowser, - isVideoLoaded, - cLog, -} from "./src/utils"; +import { getBrowser, isVideoLoaded, cLog } from "./src/utils"; import { addLikeDislikeEventListener, createSmartimationObserver, @@ -30,8 +17,8 @@ await initExtConfig(); let jsInitChecktimer = null; let isSetInitialStateDone = false; -async function setEventListeners (evt) { - async function checkForJS_Finish () { +async function setEventListeners(evt) { + async function checkForJS_Finish() { try { if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) { clearInterval(jsInitChecktimer); diff --git a/Extensions/combined/src/bar.js b/Extensions/combined/src/bar.js index c0e3492..80f20ab 100644 --- a/Extensions/combined/src/bar.js +++ b/Extensions/combined/src/bar.js @@ -54,7 +54,7 @@ function createRateBar(likes, dislikes) { if (!isShorts()) { if (!rateBar && !isMobile()) { - let colorLikeStyle = " "; + let colorLikeStyle = ""; let colorDislikeStyle = ""; if (extConfig.coloredBar) { colorLikeStyle = "; background-color: " + getColorFromTheme(true); diff --git a/Extensions/combined/src/buttons.js b/Extensions/combined/src/buttons.js index 0ff6375..074b8e5 100644 --- a/Extensions/combined/src/buttons.js +++ b/Extensions/combined/src/buttons.js @@ -1,5 +1,5 @@ import { isMobile, isShorts, extConfig } from "./state"; -import { isInViewport, querySelector, querySelectorAll } from './utils'; +import { isInViewport, querySelector, querySelectorAll } from "./utils"; function getButtons() { //--- If Watching Youtube Shorts: ---// @@ -22,7 +22,7 @@ function getButtons() { } //--- If Menu Element Is Displayed: ---// 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: ---// } else { return querySelector(extConfig.selectors.buttons.regular.desktopNoMenu); @@ -31,9 +31,16 @@ function getButtons() { function getLikeButton() { return getButtons().children[0].tagName === - 'YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER' - ? querySelector(extConfig.selectors.buttons.likeButton.segmented) ?? querySelector(extConfig.selectors.buttons.likeButton.segmentedGetButtons, getButtons()) - : querySelector(extConfig.selectors.buttons.likeButton.notSegmented, getButtons()) + "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER" + ? querySelector(extConfig.selectors.buttons.likeButton.segmented) ?? + querySelector( + extConfig.selectors.buttons.likeButton.segmentedGetButtons, + getButtons(), + ) + : querySelector( + extConfig.selectors.buttons.likeButton.notSegmented, + getButtons(), + ); } function getLikeTextContainer() { @@ -42,21 +49,45 @@ function getLikeTextContainer() { function getDislikeButton() { return getButtons().children[0].tagName === - 'YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER' - ? querySelector(extConfig.selectors.buttons.dislikeButton.segmented) ?? querySelector(extConfig.selectors.buttons.dislikeButton.segmentedGetButtons, getButtons()) - : isShorts() ? querySelector(['#dislike-button'], getButtons()) : querySelector(extConfig.selectors.buttons.dislikeButton.notSegmented, getButtons()) + "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER" + ? querySelector(extConfig.selectors.buttons.dislikeButton.segmented) ?? + querySelector( + extConfig.selectors.buttons.dislikeButton.segmentedGetButtons, + getButtons(), + ) + : isShorts() + ? querySelector(["#dislike-button"], getButtons()) + : querySelector( + extConfig.selectors.buttons.dislikeButton.notSegmented, + getButtons(), + ); } 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"); insertPreChild.insertBefore(textNodeClone, null); - getDislikeButton().querySelector("button").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) { + getDislikeButton() + .querySelector("button") + .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"); span.setAttribute("role", "text"); - while(textNodeClone.firstChild){ + while (textNodeClone.firstChild) { textNodeClone.removeChild(textNodeClone.firstChild); } textNodeClone.appendChild(span); @@ -82,7 +113,7 @@ function getDislikeTextContainer() { function checkForSignInButton() { if ( document.querySelector( - "a[href^='https://accounts.google.com/ServiceLogin']" + "a[href^='https://accounts.google.com/ServiceLogin']", ) ) { return true; diff --git a/Extensions/combined/src/events.js b/Extensions/combined/src/events.js index 77ba084..92511c7 100644 --- a/Extensions/combined/src/events.js +++ b/Extensions/combined/src/events.js @@ -1,5 +1,16 @@ -import { getBrowser, getVideoId, numberFormat, cLog, createObserver } from "./utils"; -import { checkForSignInButton, getButtons, getDislikeButton, getLikeButton } from './buttons'; +import { + getBrowser, + getVideoId, + numberFormat, + cLog, + createObserver, +} from "./utils"; +import { + checkForSignInButton, + getButtons, + getDislikeButton, + getLikeButton, +} from "./buttons"; import { NEUTRAL_STATE, LIKED_STATE, @@ -101,15 +112,21 @@ let smartimationObserver = null; function createSmartimationObserver() { if (!smartimationObserver) { - smartimationObserver = createObserver({ - attributes: true, - subtree: true - }, updateDOMDislikes); + smartimationObserver = createObserver( + { + attributes: true, + subtree: true, + }, + updateDOMDislikes, + ); smartimationObserver.container = null; } - const smartimationContainer = getButtons().querySelector('yt-smartimation'); - if (smartimationContainer && smartimationObserver.container != smartimationContainer) { + const smartimationContainer = getButtons().querySelector("yt-smartimation"); + if ( + smartimationContainer && + smartimationObserver.container != smartimationContainer + ) { cLog("Initializing smartimation mutation observer"); smartimationObserver.disconnect(); smartimationObserver.observe(smartimationContainer); @@ -120,7 +137,7 @@ function createSmartimationObserver() { function storageChangeHandler(changes, area) { if (changes.disableVoteSubmission !== undefined) { handleDisableVoteSubmissionChangeEvent( - changes.disableVoteSubmission.newValue + changes.disableVoteSubmission.newValue, ); } if (changes.coloredThumbs !== undefined) { @@ -137,7 +154,7 @@ function storageChangeHandler(changes, area) { } if (changes.numberDisplayReformatLikes !== undefined) { handleNumberDisplayReformatLikesChangeEvent( - changes.numberDisplayReformatLikes.newValue + changes.numberDisplayReformatLikes.newValue, ); } } diff --git a/Extensions/combined/src/starRating.js b/Extensions/combined/src/starRating.js index 65cf18b..74779ed 100644 --- a/Extensions/combined/src/starRating.js +++ b/Extensions/combined/src/starRating.js @@ -9,7 +9,7 @@ function createStarRating(rating, isMobile) { starSlider.setAttribute("readonly", ""); starSlider.setAttribute( "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"); @@ -19,11 +19,11 @@ function createStarRating(rating, isMobile) { if (isMobile) { 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 { 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)", ); } diff --git a/Extensions/combined/src/state.js b/Extensions/combined/src/state.js index 4aa7991..662272e 100644 --- a/Extensions/combined/src/state.js +++ b/Extensions/combined/src/state.js @@ -14,10 +14,8 @@ import { getColorFromTheme, querySelector, localize, - createObserver -} from './utils'; -import { createStarRating } from "./starRating"; -import { dislikeClicked } from './events'; + createObserver, +} from "./utils"; //TODO: Do not duplicate here and in ryd.background.js const apiUrl = "https://returnyoutubedislikeapi.com"; @@ -50,17 +48,17 @@ let extConfig = { likeButton: { segmented: [], segmentedGetButtons: [], - notSegmented: [] + notSegmented: [], }, dislikeButton: { segmented: [], segmentedGetButtons: [], - notSegmented: [] - } + notSegmented: [], + }, }, menuContainer: [], roundedDesign: [], - } + }, }; let storedData = { @@ -89,38 +87,43 @@ let shortsObserver = null; if (isShorts() && !shortsObserver) { cLog("Initializing shorts mutation observer"); - shortsObserver = createObserver({ - attributes: true - }, (mutationList) => { - mutationList.forEach((mutation) => { - if ( - mutation.type === "attributes" && - mutation.target.nodeName === "TP-YT-PAPER-BUTTON" && - mutation.target.id === "button" - ) { - // cLog('Short thumb button status changed'); - if (mutation.target.getAttribute("aria-pressed") === "true") { - mutation.target.style.color = - mutation.target.parentElement.parentElement.id === "like-button" - ? getColorFromTheme(true) - : getColorFromTheme(false); - } else { - mutation.target.style.color = "unset"; + shortsObserver = createObserver( + { + attributes: true, + }, + (mutationList) => { + mutationList.forEach((mutation) => { + if ( + mutation.type === "attributes" && + mutation.target.nodeName === "TP-YT-PAPER-BUTTON" && + mutation.target.id === "button" + ) { + // cLog('Short thumb button status changed'); + if (mutation.target.getAttribute("aria-pressed") === "true") { + mutation.target.style.color = + mutation.target.parentElement.parentElement.id === "like-button" + ? getColorFromTheme(true) + : getColorFromTheme(false); + } else { + mutation.target.style.color = "unset"; + } + return; } - return; - } - cLog( - "Unexpected mutation observer event: " + mutation.target + mutation.type - ); - }); - }); + cLog( + "Unexpected mutation observer event: " + + mutation.target + + mutation.type, + ); + }); + }, + ); } function isLikesDisabled() { // return true if the like button's text doesn't contain any number if (isMobile()) { return /^\D*$/.test( - getButtons().children[0].querySelector(".button-renderer-text").innerText + getButtons().children[0].querySelector(".button-renderer-text").innerText, ); } return /^\D*$/.test(getLikeTextContainer().innerText); @@ -129,19 +132,29 @@ function isLikesDisabled() { function isVideoLiked() { if (isMobile()) { 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() { if (isMobile()) { 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) { @@ -156,27 +169,26 @@ function getState(storedData) { //--- Sets The Likes And Dislikes Values ---// function setLikes(likesCount) { - cLog(`SET likes ${likesCount}`) + cLog(`SET likes ${likesCount}`); getLikeTextContainer().innerText = likesCount; } function setDislikes(dislikesCount) { - cLog(`SET dislikes ${dislikesCount}`) + cLog(`SET dislikes ${dislikesCount}`); getDislikeTextContainer()?.removeAttribute("is-empty"); if (!isLikesDisabled()) { if (isMobile()) { getButtons().children[1].querySelector( - ".button-renderer-text" + ".button-renderer-text", ).innerText = dislikesCount; return; } getDislikeTextContainer().innerText = dislikesCount; - } else { cLog("likes count disabled by creator"); if (isMobile()) { getButtons().children[1].querySelector( - ".button-renderer-text" + ".button-renderer-text", ).innerText = localize("TextLikesDisabled"); return; } @@ -192,12 +204,11 @@ function getLikeCountFromButton() { return false; } - let likeButton = getLikeButton() - .querySelector("yt-formatted-string#text") ?? - getLikeButton().querySelector("button"); + let likeButton = + getLikeButton().querySelector("yt-formatted-string#text") ?? + getLikeButton().querySelector("button"); - let likesStr = likeButton.getAttribute("aria-label") - .replace(/\D/g, ""); + let likesStr = likeButton.getAttribute("aria-label").replace(/\D/g, ""); return likesStr.length > 0 ? parseInt(likesStr) : false; } catch { return false; @@ -220,10 +231,10 @@ function processResponse(response, storedData) { if (isShorts()) { // for shorts, leave deactivated buttons in default color let shortLikeButton = getLikeButton().querySelector( - "tp-yt-paper-button#button" + "tp-yt-paper-button#button", ); let shortDislikeButton = getDislikeButton().querySelector( - "tp-yt-paper-button#button" + "tp-yt-paper-button#button", ); if (shortLikeButton.getAttribute("aria-pressed") === "true") { shortLikeButton.style.color = getColorFromTheme(true); @@ -244,17 +255,15 @@ function processResponse(response, storedData) { // Tells the user if the API is down function displayError(error) { - getDislikeTextContainer().innerText = localize( - "textTempUnavailable" - ); + getDislikeTextContainer().innerText = localize("textTempUnavailable"); } async function setState(storedData) { storedData.previousState = isVideoDisliked() ? DISLIKED_STATE : isVideoLiked() - ? LIKED_STATE - : NEUTRAL_STATE; + ? LIKED_STATE + : NEUTRAL_STATE; let statsSet = false; cLog("Video is loaded. Adding buttons..."); @@ -268,7 +277,7 @@ async function setState(storedData) { headers: { Accept: "application/json", }, - } + }, ) .then((response) => { if (!response.ok) displayError(response.error); @@ -283,11 +292,11 @@ async function setState(storedData) { } } -async function setInitialState () { +async function setInitialState() { await setState(storedData); } -async function initExtConfig () { +async function initExtConfig() { initializeDisableVoteSubmission(); initializeColoredThumbs(); initializeColoredBar(); @@ -299,16 +308,18 @@ async function initExtConfig () { await initializeSelectors(); } -async function initializeSelectors () { - console.log("initializing selectors") +async function initializeSelectors() { + console.log("initializing selectors"); let result = await fetch(`${apiUrl}/configs/selectors`, { method: "GET", headers: { Accept: "application/json", - } - }).then((response) => response.json()).catch((error) => {}); + }, + }) + .then((response) => response.json()) + .catch((error) => {}); extConfig.selectors = result ?? extConfig.selectors; - console.log(result) + console.log(result); } function initializeDisableVoteSubmission() { diff --git a/Extensions/combined/src/utils.js b/Extensions/combined/src/utils.js index 1fa3506..8eef6f7 100644 --- a/Extensions/combined/src/utils.js +++ b/Extensions/combined/src/utils.js @@ -1,9 +1,7 @@ import { extConfig } from "./state"; function numberFormat(numberState) { - return getNumberFormatter(extConfig.numberDisplayFormat).format( - numberState - ); + return getNumberFormatter(extConfig.numberDisplayFormat).format(numberState); } function getNumberFormatter(optionSelect) { @@ -17,11 +15,11 @@ function getNumberFormatter(optionSelect) { userLocales = new URL( Array.from(document.querySelectorAll("head > link[rel='search']")) ?.find((n) => n?.getAttribute("href")?.includes("?locale=")) - ?.getAttribute("href") + ?.getAttribute("href"), )?.searchParams?.get("locale"); } catch { 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"; } @@ -168,8 +166,12 @@ function createObserver(options, callback) { const observerWrapper = new Object(); observerWrapper.options = options; observerWrapper.observer = new MutationObserver(callback); - observerWrapper.observe = function (element) { this.observer.observe(element, this.options); } - observerWrapper.disconnect = function () { this.observer.disconnect(); } + observerWrapper.observe = function (element) { + this.observer.observe(element, this.options); + }; + observerWrapper.disconnect = function () { + this.observer.disconnect(); + }; return observerWrapper; } @@ -184,5 +186,5 @@ export { localize, querySelector, querySelectorAll, - createObserver + createObserver, }; diff --git a/README.md b/README.md index cd3761e..20878d5 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,8 @@ [![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF) [![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](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) - - # Return YouTube Dislike

diff --git a/READMEde.md b/READMEde.md index a738d82..c090fc6 100644 --- a/READMEde.md +++ b/READMEde.md @@ -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) - # Return YouTube Dislike

diff --git a/READMEes.md b/READMEes.md index 64fddb4..a4b091a 100644 --- a/READMEes.md +++ b/READMEes.md @@ -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) - # Return YouTube Dislike

diff --git a/READMEfr.md b/READMEfr.md index 2b1c18a..a84131c 100644 --- a/READMEfr.md +++ b/READMEfr.md @@ -7,8 +7,7 @@ [![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF) [![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](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 diff --git a/READMEgr.md b/READMEgr.md index 59a79c5..494872c 100644 --- a/READMEgr.md +++ b/READMEgr.md @@ -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) - # Return YouTube Dislike

diff --git a/READMEja.md b/READMEja.md index 75f976b..20a564a 100644 --- a/READMEja.md +++ b/READMEja.md @@ -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) - # Return YouTube Dislike

diff --git a/READMEnl.md b/READMEnl.md index a658239..db69386 100644 --- a/READMEnl.md +++ b/READMEnl.md @@ -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) - # Return YouTube Dislike

diff --git a/READMEpl.md b/READMEpl.md index 6b64eb6..ce65d54 100644 --- a/READMEpl.md +++ b/READMEpl.md @@ -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. -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 diff --git a/READMEru.md b/READMEru.md index 273216a..163e598 100644 --- a/READMEru.md +++ b/READMEru.md @@ -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) - # Return YouTube Dislike

diff --git a/READMEtr.md b/READMEtr.md index 54ebcfe..7efd24d 100644 --- a/READMEtr.md +++ b/READMEtr.md @@ -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) - # YouTube Dislike Sayısını Geri Getir

diff --git a/READMEuk.md b/READMEuk.md index 9014034..cefdd14 100644 --- a/READMEuk.md +++ b/READMEuk.md @@ -1,95 +1,94 @@ -[![Chrome Web Store](https://img.shields.io/chrome-web-store/stars/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Rating&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/) -[![Chrome Web Store Users](https://img.shields.io/chrome-web-store/users/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Users&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/) -[![Mozilla rating](https://img.shields.io/amo/stars/return-youtube-dislikes?label=Firefox%20Rating&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/) -[![Mozilla downloads](https://img.shields.io/amo/users/return-youtube-dislikes?label=Firefox%20Users&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/) -[![Commit rate](https://img.shields.io/github/commit-activity/m/Anarios/return-youtube-dislike?label=Commits&style=flat)](https://github.com/Anarios/return-youtube-dislike/commits/main) -[![Issues](https://img.shields.io/github/issues/Anarios/return-youtube-dislike?style=flat&label=Issues)](https://github.com/Anarios/return-youtube-dislike/issues) -[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF) -[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](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) - - -# Return YouTube Dislike - -

- Return YouTube Dislike - це розширення з відкритим вихідним кодом, яке повертає лічильник відміток «Не подобається» на YouTube.
- Доступно для Chrome та Firefox як веброзширення.
- Також доступно для інших браузерів як JS UserScript.

- -

- -## Історія - -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 року, прибравши єдину можливість оцінити якість вмісту перед переглядом. - -## Як це працює - -Після видаленням статистики відміток з API YouTube наш сервер перейшов на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними користувачів розширення. - -[ЧаПи](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQuk.md) - -## Чому це важливо - -Ви можете дізнатися більше на нашому вебсайті: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/) - -## Документація API - -Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями: - -- **Атрибуція**: Цей проєкт має бути чітко описано, використовуючи посилання на [returnyoutubedislike.com](https://returnyoutubedislike.com/). -- **Обмеження**: Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу. - -API доступно за наступною URL-адресою: -https://returnyoutubedislikeapi.com - -Перелік доступних «ендпоінтів» можна переглянути тут: -https://returnyoutubedislikeapi.com/swagger/index.html - -### Отримати оцінки - -Приклад отримання оцінок відео на YouTube за ID: -`/votes?videoId=kxOuG8jMIgI` - -```json -{ - "id": "kxOuG8jMIgI", - "dateCreated": "2021-12-20T12:25:54.418014Z", - "likes": 27326, - "dislikes": 498153, - "rating": 1.212014408444885, - "viewCount": 3149885, - "deleted": false -} -``` - -Недійсний YouTube ID видасть код помилки 404 "Not Found". -YouTube ID у невірному форматі видасть код помилки 400 "Bad Request". - - - -## Взяти участь у розробці - -Будь ласка, ознайомтеся із [посібником внеску в проєкт](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGuk.md). - -## Підтримайте цей проєкт! - -Ви можете підтримати цей проєкт пожертвою за посиланням нижче: - -[Підтримати](https://returnyoutubedislike.com/donate) - -## Спонсори - -[Piepacker](https://piepacker.com) - -[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike) - -[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike) - -[Станьте нашим спонсором](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601) +[![Chrome Web Store](https://img.shields.io/chrome-web-store/stars/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Rating&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/) +[![Chrome Web Store Users](https://img.shields.io/chrome-web-store/users/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Users&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/) +[![Mozilla rating](https://img.shields.io/amo/stars/return-youtube-dislikes?label=Firefox%20Rating&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/) +[![Mozilla downloads](https://img.shields.io/amo/users/return-youtube-dislikes?label=Firefox%20Users&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/) +[![Commit rate](https://img.shields.io/github/commit-activity/m/Anarios/return-youtube-dislike?label=Commits&style=flat)](https://github.com/Anarios/return-youtube-dislike/commits/main) +[![Issues](https://img.shields.io/github/issues/Anarios/return-youtube-dislike?style=flat&label=Issues)](https://github.com/Anarios/return-youtube-dislike/issues) +[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF) +[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](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) + +# Return YouTube Dislike + +

+ Return YouTube Dislike - це розширення з відкритим вихідним кодом, яке повертає лічильник відміток «Не подобається» на YouTube.
+ Доступно для Chrome та Firefox як веброзширення.
+ Також доступно для інших браузерів як JS UserScript.

+ +

+ +## Історія + +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 року, прибравши єдину можливість оцінити якість вмісту перед переглядом. + +## Як це працює + +Після видаленням статистики відміток з API YouTube наш сервер перейшов на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними користувачів розширення. + +[ЧаПи](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQuk.md) + +## Чому це важливо + +Ви можете дізнатися більше на нашому вебсайті: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/) + +## Документація API + +Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями: + +- **Атрибуція**: Цей проєкт має бути чітко описано, використовуючи посилання на [returnyoutubedislike.com](https://returnyoutubedislike.com/). +- **Обмеження**: Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу. + +API доступно за наступною URL-адресою: +https://returnyoutubedislikeapi.com + +Перелік доступних «ендпоінтів» можна переглянути тут: +https://returnyoutubedislikeapi.com/swagger/index.html + +### Отримати оцінки + +Приклад отримання оцінок відео на YouTube за ID: +`/votes?videoId=kxOuG8jMIgI` + +```json +{ + "id": "kxOuG8jMIgI", + "dateCreated": "2021-12-20T12:25:54.418014Z", + "likes": 27326, + "dislikes": 498153, + "rating": 1.212014408444885, + "viewCount": 3149885, + "deleted": false +} +``` + +Недійсний YouTube ID видасть код помилки 404 "Not Found". +YouTube ID у невірному форматі видасть код помилки 400 "Bad Request". + + + +## Взяти участь у розробці + +Будь ласка, ознайомтеся із [посібником внеску в проєкт](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGuk.md). + +## Підтримайте цей проєкт! + +Ви можете підтримати цей проєкт пожертвою за посиланням нижче: + +[Підтримати](https://returnyoutubedislike.com/donate) + +## Спонсори + +[Piepacker](https://piepacker.com) + +[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike) + +[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike) + +[Станьте нашим спонсором](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601) diff --git a/Website/_locales/fr.ts b/Website/_locales/fr.ts index 96eb585..e1b44b7 100644 --- a/Website/_locales/fr.ts +++ b/Website/_locales/fr.ts @@ -54,8 +54,9 @@ export default { headers: "En-têtes (headers) : ", response: "Réponse : ", error1: - '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"', + "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"', }, }, help: { diff --git a/Website/_locales/ko.ts b/Website/_locales/ko.ts index 7e394a2..adf6344 100644 --- a/Website/_locales/ko.ts +++ b/Website/_locales/ko.ts @@ -14,7 +14,8 @@ export default { title: "플랫폼 선택", subtitle: "파이어폭스와 모든 크로미엄 기반 브라우저에서 사용 가능", title2: "다른 플랫폼", - subtitle2: "당신의 브라우저가 아직 지원하지 않는 경우, 이 유저스크립트를 시도할 수 있습니다", + subtitle2: + "당신의 브라우저가 아직 지원하지 않는 경우, 이 유저스크립트를 시도할 수 있습니다", title3: "서드파티 구현", subtitle3: "우리 측의 책임이 없으며, 사용자의 책임하에 사용하십시오", }, @@ -49,9 +50,9 @@ export default { method: "요청 메소드: ", headers: "헤더: ", response: "응답: ", - error1: '유효하지 않은 유튜브 ID는 상태 코드 404 "Not Found"를 리턴합니다', - error2: - '잘못된 포멧의 유튜브 ID는 400 "Bad Request"를 리턴합니다', + error1: + '유효하지 않은 유튜브 ID는 상태 코드 404 "Not Found"를 리턴합니다', + error2: '잘못된 포멧의 유튜브 ID는 400 "Bad Request"를 리턴합니다', }, }, help: { @@ -63,7 +64,8 @@ export default { "확장 프로그램을 제거하고 재설치한 다음, 브라우저를 재시작 하세요(모든 활성 창을 말하며, 단지 하나의 탭을 말하는 것이 아닙니다)", bullet3: "이 링크가 열리는지 확인하세요: ", bullet31: "평문이 표시되어야 합니다: ", - bullet4: "위의 내용이 도움이 되지 않는 경우, 우리의 디스코드에서 다음과 같은 채널에서 당신의 문제를 보고하세요.", + bullet4: + "위의 내용이 도움이 되지 않는 경우, 우리의 디스코드에서 다음과 같은 채널에서 당신의 문제를 보고하세요.", bullet41: "디스코드: ", bullet4a: "운영체제, 브라우저 이름과 브라우저 버전을 우리한테 말해주세요", bullet4b: @@ -78,7 +80,8 @@ export default { faq: { name: "FAQ", title: "자주 묻는 질문", - subtitle: "여전히 의문점이 있으신가요? 우리의 디스코드에 무료로 가입하세요!", + subtitle: + "여전히 의문점이 있으신가요? 우리의 디스코드에 무료로 가입하세요!", bullet1: "확장 프로그램은 어디에서 데이터를 가져옵니까?", bullet1text: "공식 유튜브 싫어요 API가 닫히기 전에 보환된 데이터와 확장 프로그램 사용자 행동을 추정한 값의 조합입니다", diff --git a/Website/_locales/nl.ts b/Website/_locales/nl.ts index f5786cc..427dcce 100644 --- a/Website/_locales/nl.ts +++ b/Website/_locales/nl.ts @@ -5,7 +5,8 @@ export default { home: { name: "Home", 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", sponsors: "Sponsors", }, @@ -14,7 +15,8 @@ export default { title: "Kies je platform", subtitle: "Beschikbaar voor Firefox en alle Chromium-browsers", 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", subtitle3: "Geen aansprakelijkheid aan onze kant, gebruik op eigen risico", }, @@ -43,13 +45,15 @@ export default { }, fetching: { 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: ", url: "Verzoek-URL: ", method: "Verzoekmethode:: ", headers: "Koppen: ", response: "Antwoord: ", - error1: 'Een ongeldige YouTube-ID retourneert statuscode 404 "Niet gevonden"', + error1: + 'Een ongeldige YouTube-ID retourneert statuscode 404 "Niet gevonden"', error2: 'Een onjuist opgemaakte YouTube-ID retourneert 400 "Slecht verzoek"', }, @@ -57,7 +61,8 @@ export default { help: { name: "Help", 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", bullet2: "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: { name: "FAQ", 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?", bullet1text: "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?", 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.", - bullet7: "Waarom wordt bij het aantal dislikes 'DISLIKES DISABLED' weergegeven?", + bullet7: + "Waarom wordt bij het aantal dislikes 'DISLIKES DISABLED' weergegeven?", 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).", }, diff --git a/Website/_locales/pl.ts b/Website/_locales/pl.ts index 8ce1531..954c3a5 100644 --- a/Website/_locales/pl.ts +++ b/Website/_locales/pl.ts @@ -5,7 +5,8 @@ export default { home: { name: "Strona główna", 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ę", sponsors: "Sponsorzy", }, @@ -14,9 +15,11 @@ export default { title: "Wybierz swoją platformę", subtitle: "Dostępne dla Firefox i wszystkich przeglądarek Chromium", 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", - 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: { name: "API", @@ -43,7 +46,8 @@ export default { }, fetching: { 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: ", url: "URL żądania: ", method: "Metoda żądania: ", @@ -57,7 +61,8 @@ export default { help: { name: "Pomoc", 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.", bullet2: "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: ", bullet4: "Jeśli nic powyżej nie pomoże - zgłoś problem na", 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: "Wykonaj zrzut ekranu problematycznej strony (tj. strony filmu na YouTube) z otwartą konsolą (naciśnij ", bullet4b1: ") - przykładowy zrzut poniżej.", diff --git a/Website/_locales/sv_SE.ts b/Website/_locales/sv.ts similarity index 92% rename from Website/_locales/sv_SE.ts rename to Website/_locales/sv.ts index ab7d967..31edfc3 100644 --- a/Website/_locales/sv_SE.ts +++ b/Website/_locales/sv.ts @@ -1,11 +1,12 @@ -import { sv_SE } from "vuetify/src/locale"; +import { sv } from "vuetify/src/locale"; export default { - ...sv_SE, + ...sv, home: { name: "Hem", 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", sponsors: "Sponsorer", }, @@ -43,7 +44,8 @@ export default { }, fetching: { 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: ", url: "Request URL: ", method: "Request Method: ", @@ -57,7 +59,8 @@ export default { help: { name: "Hjälp", 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", 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)", @@ -65,7 +68,8 @@ export default { bullet31: "du bör se vanlig text: ", bullet4: "Om inget av ovanstående hjälper - rapportera ditt problem i", 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: "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.", @@ -97,7 +101,7 @@ export default { bullet6: "Hur fungerar API/Backend?", 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.", - bullet7: "Varför visar antalet ogilla "OGILLA ÄR INAKTIVERAT"?", + bullet7: "Varför visar antalet ogilla 'OGILLA ÄR INAKTIVERAT'?", 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).", }, diff --git a/Website/_locales/tr.ts b/Website/_locales/tr.ts index 4fc64f2..12298b2 100644 --- a/Website/_locales/tr.ts +++ b/Website/_locales/tr.ts @@ -5,7 +5,8 @@ export default { home: { name: "Ana Sayfa", 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", sponsors: "Sponsorlar", }, @@ -14,9 +15,11 @@ export default { title: "Platformunuzu Seçin", subtitle: "Firefox ve bütün Chromium tabanlı tarayıcılarda kullanılabilir", 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", - 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: { name: "API", @@ -43,7 +46,8 @@ export default { }, fetching: { 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: ", url: "İstek URL'si: ", method: "İstek Yöntemi: ", @@ -64,11 +68,13 @@ export default { bullet3: "Şu bağlantıyı açtığınızdan emin olun: ", bullet31: "şöyle bir düz metin görmelisiniz: ", bullet4: "Yukarıdakiler yardımcı olmadıysa - Discord sunucumuzdaki ", - bullet41: " kanalından problemi bildirin (İngilizce bir şekilde) Discord sunucumuz: ", - bullet4a: "Bize İşletim Sisteminizi, Tarayıcı Adınızı ve Tarayıcı Sürümünüzü söyleyin", - 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.", + bullet41: + " kanalından problemi bildirin (İngilizce bir şekilde) Discord sunucumuz: ", + bullet4a: + "Bize İşletim Sisteminizi, Tarayıcı Adınızı ve Tarayıcı Sürümünüzü söyleyin", + 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: "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: ", @@ -78,7 +84,8 @@ export default { faq: { name: "SSS", 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?", 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.", diff --git a/Website/_locales/uk.ts b/Website/_locales/uk.ts index 17d06ab..da1a5b9 100644 --- a/Website/_locales/uk.ts +++ b/Website/_locales/uk.ts @@ -1,119 +1,125 @@ -import { uk } from "vuetify/src/locale"; -// By dsty#1614 -export default { - ...uk, - home: { - name: "Головна", - title: "Return YouTube Dislike", - subtitle: "Браузерне розширення та API, що дозволяє вам бачити відмітки «Не подобається» на YouTube", - ukraine: "Підтримати Україну", - sponsors: "Спонсори", - }, - install: { - name: "Завантажити", - title: "Оберіть вашу платформу", - subtitle: "Доступно на Firefox та усіх Chromium браузерах", - title2: "Інші платформи", - subtitle2: "Якщо ваш браузер не підтримується, спробуйте цей UserScript", - title3: "Стороннє ПЗ", - subtitle3: "Ми не маємо відношення до цього, використовуйте на свій страх і ризик", - }, - api: { - name: "API", - title: "Вітаємо у офіційній документації RYD!", - subtitle: "Щоб почати, виберіть розділ у меню.", - rights: { - title: "Права використання", - subtitle: - "Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:", - bullet1: "Атрибуція: ", - bullet1text: - "Цей проєкт має бути чітко описано, використовуючи посилання, або ж на цей репозиторій, або ж на returnyoutubedislike.com", - bullet2: "Обмеження: ", - bullet2text: - "Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу", - }, - url: { - title: "Інформація про посилання", - subtitle: "API доступний за наступним посиланням: ", - }, - endpoints: { - title: "Достпупні «ендпоінти»", - subtitle: "Перелік доступних «ендпоінтів» можна переглянути тут: ", - }, - fetching: { - title: "Базовий посібник по отриманню", - subtitle: "Приклад отримання оцінок відео на YouTube за ID ", - title2: "Приклад запиту: ", - url: "Посилання запиту: ", - method: "Метод запиту: ", - headers: "Заголовок: ", - response: "Відповідь: ", - error1: 'Недійсний YouTube ID видасть код помилки 404 "Not Found"', - error2: - 'YouTube ID у невірному форматі видасть код помилки 400 "Bad Request"', - }, - }, - help: { - name: "Допомога", - title: "Усунення несправностей", - bullet1: "Переконайтеся, що у вас встановлена остання версія розширення, наразі це - ", - bullet11: "", - bullet2: - "Спробуйте видалити розширення і встановити його знову, а потім перезавантажте браузер (усі активні вікна, а не лише одну вкладку).", - bullet3: "Переконайтеся, що наступне посилання відкривається: ", - bullet31: "і ви бачите там цей текст: ", - bullet4: "Якщо нічого з перерахованого вище не допомогло - повідомте про проблему в каналі", - bullet41: "у нашому", - bullet4a: "Повідомте нам вашу операційну систему, назву та версію браузера", - bullet4b: - "Зробіть знімок екрана сторінки з проблемою (тобто сторінки відео на YouTube) із відкритою консоллю (натисніть ", - bullet4b1: ") - приклад знімка екрана нижче.", - bullet4c: - "Зробіть знімок екрана сторінки з встановленими розширеннями вашого браузера.", - bullet4c1: "Щоб побачити розширення, напишіть це в адресний рядок: ", - firefox: "для Firefox", - chrome: "для Chrome, Edge, Brave, Opera, Vivaldi", - }, - faq: { - name: "ЧаПи", - title: "Часті питання", - subtitle: "Залишилися питання? Не соромтеся приєднуватися до нашого Discord!", - bullet1: "Звідки розширення отримує дані?", - bullet1text: - "Комбінація архівних даних, отриманих до закриття офіційного API відміток «Не подобається» на YouTube та екстрапольованої поведінки користувачів розширення.", - bullet2: "Чому кількість відміток «Не подобається» не оновлюється?", - bullet2text: - "Наразі відмітки «Не подобається» кешуються й не оновлюються надто часто. Це залежить від популярності відео, але для оновлення може знадобитися від кількох годин до кількох днів.", - bullet3: "Як це працює?", - bullet3text: - "Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API. Потім розширення відображає кількість відміток «Не подобається» та їх коефіцієнт на сторінці. Якщо ви ставите відмітки «Подобається» чи «Не подобається», це записується та надсилається до бази даних, щоб можна було екстраполювати точну їх кількість нелайків.", - bullet4: "Чи можу я поділитися з вами своїми відмітками «Не подобається»?", - bullet4text: - "Незабаром. Ми розглядаємо можливість використання Oauth або іншого API, доступного тільки для читання, з обмеженою областю дій, щоб творці могли ділитися своїми відмітками «Не подобається»", - bullet5: "Які дані ви збираєте та як вони обробляються?", - bullet5text: - 'Розширення збирає лише ті дані, які необхідні для правильної його роботи, такі як IP-адреси або ID відео, яке ви дивитеся. Ваші дані ніколи не будуть продані третім особам. Якщо ви хочете дізнатися більше про те, як ми забезпечуємо безпеку та конфіденційність, ознайомтесь з нашими ЧаПи по безпеці.', - bullet6: "Як працює API/серверна сторона?", - bullet6text: - "Серверна частина використовує архівні дані з тих пір, доки YouTube API все ще видавав кількість відміток «Не подобається», а також відмітки «Подобається»/«Не подобається» користувачів розширення та екстраполяцію. В найближчому майбутньому ми дозволимо творцям контенту легко та безпечно надсилати свої відмітки «Не подобається», а також ми додамо архівні дані ArchiveTeam (4,56 мільярди відео) до нашої поточної бази даних. Ви можете переглянути відео на цю тему.", - bullet7: "Чому лічильник відміток «Не подобається» пише 'DISLIKES DISABLED'?", - bullet7text: - "Іноді на нещодавно завантаженому відео може з'являтися повідомлення 'DISLIKES DISABLED', навіть попри те, що автор не вимикав відмітки «Не подобається». Це пов’язано з тим, як ми визначаємо, чи вимкнені оцінки «Не подобається». Це повідомлення має зникнути через кілька годин або після отримання відмітки «Подобається»/«Не подобається» і оновлення сторінки (сподіваюся).", - }, - donate: { - name: "Підтримати", - subtitle: - "Ви можете підтримати пожертвою наші зусилля зробити Інтернет вільнішим!", - }, - links: { - name: "Посилання", - title: "Посилання проєкту", - subtitle: "Посилання на проєкт і його розробників", - contact: "Зв'язок зі мною", - translators: "Перекладачі", - coolProjects: "Круті проєкти", - sponsorBlockDescription: "пропускає вбудовану у відео рекламу", - filmotDescription: "пошук відео на YouTube по субтитрах", - }, -}; \ No newline at end of file +import { uk } from "vuetify/src/locale"; +// By dsty#1614 +export default { + ...uk, + home: { + name: "Головна", + title: "Return YouTube Dislike", + subtitle: + "Браузерне розширення та API, що дозволяє вам бачити відмітки «Не подобається» на YouTube", + ukraine: "Підтримати Україну", + sponsors: "Спонсори", + }, + install: { + name: "Завантажити", + title: "Оберіть вашу платформу", + subtitle: "Доступно на Firefox та усіх Chromium браузерах", + title2: "Інші платформи", + subtitle2: "Якщо ваш браузер не підтримується, спробуйте цей UserScript", + title3: "Стороннє ПЗ", + subtitle3: + "Ми не маємо відношення до цього, використовуйте на свій страх і ризик", + }, + api: { + name: "API", + title: "Вітаємо у офіційній документації RYD!", + subtitle: "Щоб почати, виберіть розділ у меню.", + rights: { + title: "Права використання", + subtitle: + "Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:", + bullet1: "Атрибуція: ", + bullet1text: + "Цей проєкт має бути чітко описано, використовуючи посилання, або ж на цей репозиторій, або ж на returnyoutubedislike.com", + bullet2: "Обмеження: ", + bullet2text: + "Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу", + }, + url: { + title: "Інформація про посилання", + subtitle: "API доступний за наступним посиланням: ", + }, + endpoints: { + title: "Достпупні «ендпоінти»", + subtitle: "Перелік доступних «ендпоінтів» можна переглянути тут: ", + }, + fetching: { + title: "Базовий посібник по отриманню", + subtitle: "Приклад отримання оцінок відео на YouTube за ID ", + title2: "Приклад запиту: ", + url: "Посилання запиту: ", + method: "Метод запиту: ", + headers: "Заголовок: ", + response: "Відповідь: ", + error1: 'Недійсний YouTube ID видасть код помилки 404 "Not Found"', + error2: + 'YouTube ID у невірному форматі видасть код помилки 400 "Bad Request"', + }, + }, + help: { + name: "Допомога", + title: "Усунення несправностей", + bullet1: + "Переконайтеся, що у вас встановлена остання версія розширення, наразі це - ", + bullet11: "", + bullet2: + "Спробуйте видалити розширення і встановити його знову, а потім перезавантажте браузер (усі активні вікна, а не лише одну вкладку).", + bullet3: "Переконайтеся, що наступне посилання відкривається: ", + bullet31: "і ви бачите там цей текст: ", + bullet4: + "Якщо нічого з перерахованого вище не допомогло - повідомте про проблему в каналі", + bullet41: "у нашому", + bullet4a: "Повідомте нам вашу операційну систему, назву та версію браузера", + bullet4b: + "Зробіть знімок екрана сторінки з проблемою (тобто сторінки відео на YouTube) із відкритою консоллю (натисніть ", + bullet4b1: ") - приклад знімка екрана нижче.", + bullet4c: + "Зробіть знімок екрана сторінки з встановленими розширеннями вашого браузера.", + bullet4c1: "Щоб побачити розширення, напишіть це в адресний рядок: ", + firefox: "для Firefox", + chrome: "для Chrome, Edge, Brave, Opera, Vivaldi", + }, + faq: { + name: "ЧаПи", + title: "Часті питання", + subtitle: + "Залишилися питання? Не соромтеся приєднуватися до нашого Discord!", + bullet1: "Звідки розширення отримує дані?", + bullet1text: + "Комбінація архівних даних, отриманих до закриття офіційного API відміток «Не подобається» на YouTube та екстрапольованої поведінки користувачів розширення.", + bullet2: "Чому кількість відміток «Не подобається» не оновлюється?", + bullet2text: + "Наразі відмітки «Не подобається» кешуються й не оновлюються надто часто. Це залежить від популярності відео, але для оновлення може знадобитися від кількох годин до кількох днів.", + bullet3: "Як це працює?", + bullet3text: + "Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API. Потім розширення відображає кількість відміток «Не подобається» та їх коефіцієнт на сторінці. Якщо ви ставите відмітки «Подобається» чи «Не подобається», це записується та надсилається до бази даних, щоб можна було екстраполювати точну їх кількість нелайків.", + bullet4: "Чи можу я поділитися з вами своїми відмітками «Не подобається»?", + bullet4text: + "Незабаром. Ми розглядаємо можливість використання Oauth або іншого API, доступного тільки для читання, з обмеженою областю дій, щоб творці могли ділитися своїми відмітками «Не подобається»", + bullet5: "Які дані ви збираєте та як вони обробляються?", + bullet5text: + 'Розширення збирає лише ті дані, які необхідні для правильної його роботи, такі як IP-адреси або ID відео, яке ви дивитеся. Ваші дані ніколи не будуть продані третім особам. Якщо ви хочете дізнатися більше про те, як ми забезпечуємо безпеку та конфіденційність, ознайомтесь з нашими ЧаПи по безпеці.', + bullet6: "Як працює API/серверна сторона?", + bullet6text: + "Серверна частина використовує архівні дані з тих пір, доки YouTube API все ще видавав кількість відміток «Не подобається», а також відмітки «Подобається»/«Не подобається» користувачів розширення та екстраполяцію. В найближчому майбутньому ми дозволимо творцям контенту легко та безпечно надсилати свої відмітки «Не подобається», а також ми додамо архівні дані ArchiveTeam (4,56 мільярди відео) до нашої поточної бази даних. Ви можете переглянути відео на цю тему.", + bullet7: + "Чому лічильник відміток «Не подобається» пише 'DISLIKES DISABLED'?", + bullet7text: + "Іноді на нещодавно завантаженому відео може з'являтися повідомлення 'DISLIKES DISABLED', навіть попри те, що автор не вимикав відмітки «Не подобається». Це пов’язано з тим, як ми визначаємо, чи вимкнені оцінки «Не подобається». Це повідомлення має зникнути через кілька годин або після отримання відмітки «Подобається»/«Не подобається» і оновлення сторінки (сподіваюся).", + }, + donate: { + name: "Підтримати", + subtitle: + "Ви можете підтримати пожертвою наші зусилля зробити Інтернет вільнішим!", + }, + links: { + name: "Посилання", + title: "Посилання проєкту", + subtitle: "Посилання на проєкт і його розробників", + contact: "Зв'язок зі мною", + translators: "Перекладачі", + coolProjects: "Круті проєкти", + sponsorBlockDescription: "пропускає вбудовану у відео рекламу", + filmotDescription: "пошук відео на YouTube по субтитрах", + }, +}; diff --git a/Website/layouts/default.vue b/Website/layouts/default.vue index 1fb3518..512cb54 100644 --- a/Website/layouts/default.vue +++ b/Website/layouts/default.vue @@ -109,7 +109,7 @@ export default { // { name: "Deutsch", locale: "de" }, { name: "Українська", locale: "uk" }, { name: "한국어", locale: "ko" }, - { name: "Polski", locale: "pl"}, + { name: "Polski", locale: "pl" }, ], alert: { show: false, diff --git a/Website/pages/debug.vue b/Website/pages/debug.vue index fa1e863..928b8b2 100644 --- a/Website/pages/debug.vue +++ b/Website/pages/debug.vue @@ -177,7 +177,7 @@ export default { setTimeout(() => { this.$axios .$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) => { this.userInformation.extension.latestExtensionVersion = res.version; diff --git a/Website/pages/help.vue b/Website/pages/help.vue index 4bfc7a5..c364e67 100644 --- a/Website/pages/help.vue +++ b/Website/pages/help.vue @@ -133,7 +133,7 @@ export default { }, mounted() { 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((json) => { diff --git a/Website/pages/index.vue b/Website/pages/index.vue index b150473..0819de3 100644 --- a/Website/pages/index.vue +++ b/Website/pages/index.vue @@ -125,13 +125,13 @@ export default { if (videoId !== lastVideoId && videoId.length === 11) { fetch( "https://returnyoutubedislikeapi.com/votes?videoId=" + - (lastVideoId = videoId) + (lastVideoId = videoId), ) .then((resp) => resp.json()) .then( (data) => (document.getElementById("output").innerText = - "Likes=" + data.likes + " Dislikes=" + data.dislikes) + "Likes=" + data.likes + " Dislikes=" + data.dislikes), ); } }; @@ -162,7 +162,8 @@ input { stroke: #f44; transition-property: opacity, transform; 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; } diff --git a/Website/pages/links.vue b/Website/pages/links.vue index d0d4c34..d07f02d 100644 --- a/Website/pages/links.vue +++ b/Website/pages/links.vue @@ -120,7 +120,7 @@ export default { { tag: "itsbudyn#6502", lang: "Polski", - } + }, ], coolProjects: [ { diff --git a/package.json b/package.json index fddd304..e7e7bac 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,11 @@ "dev": "webpack --mode=production --watch", "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", - "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": { "type": "git", @@ -32,6 +36,9 @@ "babel-loader": "^9.1.3", "copy-webpack-plugin": "^11.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-cli": "^5.1.4" } diff --git a/webpack.config.js b/webpack.config.js index a0ccf92..0c2211c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -17,7 +17,7 @@ module.exports = { entries.map((entry) => [ entry, path.join(__dirname, "./Extensions/combined/", `${entry}.js`), - ]) + ]), ), output: { filename: "[name].js", @@ -89,7 +89,6 @@ module.exports = { }, }, }), - ], experiments: { topLevelAwait: true,