Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Anarios/return-youtube-dislike.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitrii Selivanov <selivano.d@gmail.com>2022-07-20 01:54:10 +0300
committerGitHub <noreply@github.com>2022-07-20 01:54:10 +0300
commitc4e85f1f90d00d4b599f8665dec048b85ffc8d08 (patch)
tree429d069d7e7c89fc5c1bfa271b8218492b218275
parent386fa9785844a216289dd2e481eb6c0409fd3389 (diff)
parente3c7f3fbbce4bf766610d478f1dc3a469325e559 (diff)
Merge branch 'develop' into improved-translations
-rw-r--r--.github/ISSUE_TEMPLATE/bug.yml11
-rw-r--r--.github/ISSUE_TEMPLATE/feature-request.yml10
-rw-r--r--.github/workflows/commentCommands.yml54
-rw-r--r--CONTRIBUTING.md2
-rw-r--r--CONTRIBUTINGfr.md59
-rw-r--r--CONTRIBUTINGru.md60
-rw-r--r--Docs/FAQ.md34
-rw-r--r--Docs/FAQfr.md23
-rw-r--r--Docs/FAQru.txt21
-rw-r--r--Docs/SECURITY-FAQ.md2
-rw-r--r--Docs/SECURITY-FAQfr.md31
-rw-r--r--Docs/SECURITY-FAQru.md31
-rw-r--r--Docs/readme.md2
-rw-r--r--Docs/readmefr.md39
-rw-r--r--Extensions/UserScript/Return Youtube Dislike.user.js89
-rw-r--r--Extensions/combined/_locales/en/messages.json48
-rw-r--r--Extensions/combined/_locales/es/messages.json58
-rw-r--r--Extensions/combined/_locales/pt_BR/messages.json44
-rw-r--r--Extensions/combined/_locales/tr/messages.json3
-rw-r--r--Extensions/combined/popup.css67
-rw-r--r--Extensions/combined/popup.html28
-rw-r--r--Extensions/combined/popup.js50
-rw-r--r--Extensions/combined/ryd.background.js41
-rw-r--r--Extensions/combined/src/bar.js113
-rw-r--r--Extensions/combined/src/events.js13
-rw-r--r--Extensions/combined/src/starRating.js101
-rw-r--r--Extensions/combined/src/state.js30
-rw-r--r--Extensions/combined/src/utils.js46
-rw-r--r--README.md4
-rw-r--r--READMEes.md46
-rw-r--r--READMEfr.md96
-rw-r--r--READMEja.md99
-rw-r--r--READMEru.md18
-rw-r--r--READMEtr.md4
-rw-r--r--Website/_locales/en.ts4
-rw-r--r--Website/_locales/es.ts93
-rw-r--r--Website/_locales/fr.ts104
-rw-r--r--Website/_locales/ru.ts52
-rw-r--r--Website/_locales/tr.ts15
-rw-r--r--Website/layouts/default.vue2
-rw-r--r--Website/nuxt.config.js4
-rw-r--r--Website/pages/links.vue4
-rw-r--r--extension-description-store-french.txt20
-rw-r--r--extension-description-store-spanish.txt20
-rw-r--r--extension-description-store.txt2
45 files changed, 1452 insertions, 245 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml
index 2bf949b..177632e 100644
--- a/.github/ISSUE_TEMPLATE/bug.yml
+++ b/.github/ISSUE_TEMPLATE/bug.yml
@@ -1,6 +1,6 @@
name: Bug Report
description: File a bug report!
-title: "(Bug): "
+# title: "(Bug): "
labels: ["bug"]
body:
- type: input
@@ -55,4 +55,13 @@ body:
value: "Tell us how it happened with detailed steps for us."
validations:
required: true
+- type: dropdown
+ attributes:
+ label: "Will you be available for follow-up questions to help developers diagnose & fix the issue?"
+ options:
+ - "Yes"
+ - "No"
+ validations:
+ required: true
+
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
index b9a15d6..123d9d0 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -1,6 +1,6 @@
name: Feature Request
description: Request or suggest a new feature!
-title: "(Feature Request): "
+# title: "(Feature Request): "
labels: ["enhancement"]
body:
- type: dropdown
@@ -28,4 +28,12 @@ body:
options:
- label: "Yes"
- label: "No"
+- type: dropdown
+ attributes:
+ label: "Will you be available for follow-up questions to help developers implement this?"
+ options:
+ - "Yes"
+ - "No"
+ validations:
+ required: true
diff --git a/.github/workflows/commentCommands.yml b/.github/workflows/commentCommands.yml
new file mode 100644
index 0000000..fbf4aad
--- /dev/null
+++ b/.github/workflows/commentCommands.yml
@@ -0,0 +1,54 @@
+name: commentCommands
+
+on:
+ issue_comment:
+ types: created
+
+jobs:
+
+ assign-commenter:
+ runs-on: ubuntu-latest
+ if: |
+ contains(github.event.comment.body, '/assignme') ||
+ contains(github.event.comment.body, '/assign me')
+ steps:
+ - name: Assigning to commenter
+ run: |
+ curl \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/assignees \
+ -d '{"assignees":["${{ github.event.comment.user.login }}"]}'
+ request-issue-framing-improvement:
+ runs-on: ubuntu-latest
+ if: |
+ contains(github.event.comment.body,'/improve') && (
+ github.event.comment.author_association == 'OWNER' ||
+ github.event.comment.author_association == 'COLLABORATOR' ||
+ github.event.comment.author_association == 'CONTRIBUTOR' )
+ steps:
+ - name: request-issue-framing-improvement
+ run: |
+ curl \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments \
+ -d '{"body":"This issue is put on hold due to low quality. No reviews or fixes will be performed at this time. Eventually, it will be closed. While we appreciate your effort writing, we are not able to further investigate it. Please improve it by writing a better title or providing more details, and you may re-open it."}'
+ add-label-duplicate:
+ runs-on: ubuntu-latest
+ if: |
+ contains(github.event.comment.body, '/duplicate') && (
+ github.event.comment.author_association == 'OWNER' ||
+ github.event.comment.author_association == 'COLLABORATOR' ||
+ github.event.comment.author_association != 'CONTRIBUTOR' )
+ steps:
+ - name: add-label-duplicate
+ run: |
+ curl \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/labels \
+ -d '{"labels":["duplicate"]}'
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d05c308..b185db8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,5 @@
+Read this in other languages: [Français](CONTRIBUTINGfr.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
new file mode 100644
index 0000000..5a8f07a
--- /dev/null
+++ b/CONTRIBUTINGfr.md
@@ -0,0 +1,59 @@
+Lisez ceci dans d'autres langues : [English](CONTRIBUTING.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).
+
+## Pour commencer
+Veuillez utiliser [Prettier](https://prettier.io/) avec les paramètres par défaut pour le formatage du code.
+
+#### Prérequis
+Vous devez avoir installé node et npm pour créer la version bundle depuis le code source.
+
+Versions utilisées lors de la mise en place :
+
+- node: 12.18.4
+- npm: 6.14.6
+
+Pour créer le fichier `bundled-content-script.js` qui contient la plupart de la logique de cette extension, vous devez d'abord installer toutes les dépendances.
+
+1. Allez à la racine du repo et exécutez :
+
+```
+npm install
+```
+
+2. Exécutez la commande suivante pour créer le fichier `bundled-content-script.js` qui est utilisé dans le fichier `manifest.json`.
+
+```
+npm start // pour créer le(s) fichier(s) de construction et lancer un observateur de fichiers qui recharge à chaud lors de la sauvegarde.
+
+// ou
+
+npm run build // pour créer le(s) fichier(s) de construction une seule fois
+```
+
+Félicitations, vous êtes maintenant prêt·e à développer !
+
+Si vous n'avez jamais développé d'extensions pour Chrome ou si vous avez besoin d'une aide supplémentaire, consultez [ce tutoriel YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) (en anglais).
+
+
+### Problèmes (aussi appelé issues en anglais)
+#### Signaler un problème
+Si vous rencontrez des problèmes avec l'extension, vérifiez que le problème n'a pas déjà été signalé. Si ce n'est pas le cas, [signalez le problème](https://github.com/Anarios/return-youtube-dislike/issues/new?assignees=&labels=bug&template=bug.yml&title=%28Bug%29%3A+), en utilisant le formulaire qui est fortement recommandé mais pas obligatoire.
+
+#### Résoudre un problème
+Si vous avez trouvé un problème que vous pensez pouvoir résoudre, ne soyez pas timide. Ouvrez une [PR](https://github.com/Anarios/return-youtube-dislike/pulls) [(C'est quoi ?)](https://blog.zenika.com/2017/01/24/pull-request-demystifie/) avec la solution et assurez-vous de mentionner le problème que vous résolvez (écrivez # puis le numéro de l'issue).
+
+### Demande de fonctionnalité (aussi appelé feature request en anglais)
+#### Ouverture d'une nouvelle demande de fonctionnalité
+Si vous avez une idée pour l'extension, n'hésitez pas à [ouvrir une demande de fonctionnalité](https://github.com/Anarios/return-youtube-dislike/issues/new?assignees=&labels=enhancement&template=feature-request.yml&title=%28Feature+Request%29%3A+), mais veuillez effectuer une recherche préalable pour vous assurer que la fonctionnalité n'est pas déjà proposée. L'utilisation du formulaire de demande de fonctionnalité est fortement recommandée mais pas obligatoire.
+
+#### Implémenter une demande de fonctionnalité
+Si vous avez trouvé une fonctionnalité que vous pensez pouvoir mettre en œuvre, ne soyez pas timide. Ouvrez une [PR](https://github.com/Anarios/return-youtube-dislike/pulls) [(C'est quoi ?)](https://blog.zenika.com/2017/01/24/pull-request-demystifie/) avec le correctif et assurez-vous de mentionner la fonctionnalité que vous implémentez (écrivez # puis le numéro de l'issue).
+
+### Quels PR acceptons-nous ?
+- Correction de problèmes.
+- Implémentation de fonctionnalités.
+- Fautes de frappe ou utilisation de mots plus simples et plus efficaces.
+- Contributions au site web. \ No newline at end of file
diff --git a/CONTRIBUTINGru.md b/CONTRIBUTINGru.md
new file mode 100644
index 0000000..e217046
--- /dev/null
+++ b/CONTRIBUTINGru.md
@@ -0,0 +1,60 @@
+Прочитать на других языках: [English](CONTRIBUTING.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) мы принимаем?
+- Исправления проблем.
+- Внедрения новых функций.
+- Исправления опечаток и упрощение текста.
+- Улучшения сайта. \ No newline at end of file
diff --git a/Docs/FAQ.md b/Docs/FAQ.md
index 02336f4..8efc8c9 100644
--- a/Docs/FAQ.md
+++ b/Docs/FAQ.md
@@ -1,21 +1,55 @@
+Read this in other languages: [Français](FAQfr.md)
+
# Frequently Asked Questions
## Before asking a question on GitHub or Discord, please refer to this.
+<br>
+
### **1. Where does this extension get the data?**
A Combination of Google APIs and scraped data.
We save all available data to our DB for it to be available after Google shuts down dislike counts in their API.
+<br>
+
### **2. Video dislike count doesn't update**
Right now video dislikes are cached, and aren't updated very frequenly. Once every 2-3 days, not more often.
Yeah, it's not ideal, but it is what it is. Working on improving how often we can update them.
+<br>
+
### **3. How does this work?**
The extension collects the video id of the video you are watching, fetches the dislike (and other fields like views, likes etc) using our API, if this is the first time the video was fetched by our API, it will use the YouTube API to get the data, then stores the data in a database for caching (cached for around 2-3 days) and archiving purposes and returns it to you. The extension then displays the dislikes to you.
+<br>
+
### **4. What will happen after the YouTube API stops returning the dislike count?**
The backend will switch to using a combination of archived dislike stats, estimates extrapolated from extension user data and estimates based on view/like ratios for videos whose dislikes weren't archived and for outdated dislike archives.
+<br>
+
+### **5. How is the dislike count calculated?**
+
+RYD uses the votes from it's users to extrapolate the dislike count.
+
+- If the video was uploaded after the API was shut down:
+
+ $$ \textup{RYD Dislike Count} = \left( \frac{\textup{RYD Users Like Count}}{\textup{RYD Users Dislike Count}} \right) \times \textup{Public Like Count} $$
+
+- If the RYD database somehow had the actual like and dislike count (provided by the uploader or from the archive), the dislike count will be calculated based on both - the users' votes and the archived value. The archived value will have less influence on the final count as it ages.
+
+<br>
+
+---
+
+This in video form
+
+[![IReturn YouTube Dislike Explained](https://yt-embed.herokuapp.com/embed?v=GSmmtv-0yYQ)](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
+
+---
+
+<br>
+
## I have security / privacy concerns
See [this page](SECURITY-FAQ.md) for more info.
diff --git a/Docs/FAQfr.md b/Docs/FAQfr.md
new file mode 100644
index 0000000..c6c702e
--- /dev/null
+++ b/Docs/FAQfr.md
@@ -0,0 +1,23 @@
+Lisez ceci dans d'autres langues : [English](FAQ.md)
+
+# Foire Aux Questions
+## Avant de poser une question sur GitHub ou Discord, veuillez vous référer à ceci.
+
+### **1. Où cette extension obtient-elle les données ?**
+Une combinaison d'API de Google et de données scrapées.
+
+Nous sauvegardons toutes les données disponibles dans notre base de données pour qu'elles soient disponibles après que Google ait supprimé le compteur de dislikes dans son API.
+
+### **2. Le nombre de dislikes sur les vidéos n'est pas mis à jour**
+Actuellement, les dislike sont mis en cache et ne sont pas mis à jour très fréquemment. Une fois tous les 2-3 jours, pas plus souvent.
+
+Oui, ce n'est pas idéal, mais c'est ce que c'est. Nous travaillons à améliorer la fréquence des mises à jour.
+
+### **3. Comment cela fonctionne-t-il ?**
+L'extension collecte l'ID de la vidéo que vous regardez, récupère les dislikes (et d'autres champs comme les vues, les likes etc.) en utilisant notre API, si c'est la première fois que la vidéo a été récupérée par notre API, elle utilisera l'API YouTube pour obtenir les données, puis stocke les données dans une base de données pour la mise en cache (mise en cache pendant environ 2-3 jours) et à des fins d'archivage et vous les renvoie. L'extension vous affiche ensuite les dislikes.
+
+### **4. Que se passera-t-il lorsque l'API YouTube ne renverra plus le nombre de dislikes ?**
+Le backend utilisera une combinaison de statistiques du nombre de dislikes archivées, d'estimations extrapolées à partir des données d'extension des utilisateurs et d'estimations basées sur les ratios vues/likes pour les vidéos dont les dislikes n'ont pas été archivées et pour les archives dont le nombre de dislikes est obsolète.
+
+## Je suis préoccupé par la sécurité / la confidentialité
+Voir [cette page](SECURITY-FAQfr.md) pour plus d'informations. \ No newline at end of file
diff --git a/Docs/FAQru.txt b/Docs/FAQru.txt
new file mode 100644
index 0000000..5c770df
--- /dev/null
+++ b/Docs/FAQru.txt
@@ -0,0 +1,21 @@
+# Часто задаваемые вопросы
+## Прежде чем задать вопрос на GitHub или в Discord, пожалуйста, ознакомьтесь с этим.
+
+### **1. Откуда это расширение получает данные?**
+Комбинация API Google и старых данных.
+
+Мы сохраняем все имеющиеся данные в нашей базе данных, чтобы они были доступны после того, как Google прекратит подсчёт отметок «Не нравится» в своём API.
+
+### **2. Количество не понравившихся видео не обновляется**
+В настоящее время видео с отметками «Не нравится» кэшируются и обновляются не очень часто. Раз в 2-3 дня, не чаще.
+
+Да, это не идеально, но это то, что есть. Мы работаем над тем, чтобы улучшить частоту их обновления.
+
+### **3. Как это работает?**
+Расширение собирает идентификатор видео, которое вы смотрите, извлекает данные об отметках «Не нравится» (и другие поля, такие как просмотры, отметки «Нравится» и т.д.) с помощью нашего API, если видео было извлечено нашим API впервые, оно использует YouTube API для получения данных, затем сохраняет данные в базе данных для кэширования (кэшируются около 2-3 дней) и архивирования и возвращает их вам. После этого расширение отображает отметки «Не нравится» вам.
+
+### **4. Что произойдёт после того, как API YouTube перестанет возвращать данные о количестве отметок «Не нравится»?**
+Внутренняя часть нашего сервера переключится на использование комбинации архивных статистик отметок «Не нравится», оценок, экстраполированных из данных о пользователях расширения, и оценок, основанных на соотношении просмотров и отметок «Нравится» для видео, чьи отметки «Не нравится» не были заархивированы, и для устаревших архивов с отметками «Не нравится».
+
+## Я беспокоюсь о безопасности / конфиденциальности
+Более подробную информацию смотрите на [этой странице](SECURITY-FAQ.md). \ No newline at end of file
diff --git a/Docs/SECURITY-FAQ.md b/Docs/SECURITY-FAQ.md
index b9eb259..d7f11a9 100644
--- a/Docs/SECURITY-FAQ.md
+++ b/Docs/SECURITY-FAQ.md
@@ -1,3 +1,5 @@
+Read this in other languages: [Français](SECURITY-FAQfr.md)
+
# Security
### Are you tracking my viewing history?
diff --git a/Docs/SECURITY-FAQfr.md b/Docs/SECURITY-FAQfr.md
new file mode 100644
index 0000000..633e4c7
--- /dev/null
+++ b/Docs/SECURITY-FAQfr.md
@@ -0,0 +1,31 @@
+Lisez ceci dans d'autres langues : [English](SECURITY-FAQ.md)
+
+# Sécurité
+
+### Est-ce que vous traquer l'historique des vidéos que je visionne ?
+
+Non. Le code de l'extension est public et vous pouvez le voir par vous-même. La seule information envoyée est l'ID de la vidéo, qui est nécessaire pour récupérer le nombre de dislikes des vidéos. Aucun en-tête (headers) supplémentaire n'est envoyé. Sur la [couche de communication](https://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI#Caract%C3%A9risation_r%C3%A9sum%C3%A9e_des_couches), votre adresse IP publique sera exposée au serveur, ainsi que l'heure à laquelle la demande a été faite. Toutefois, aucun de ces éléments ne permet de vous identifier de manière unique. Dans un environnement où vous ne pouvez avoir confiance en personne (zero-trust environment), le mieux que l'on puisse obtenir est une IP dynamique. Qui, aujourd'hui est la vôtre, demain est celle de votre voisin. Si vous êtes vraiment inquiet que votre IP soit tracée, vous utilisez probablement déjà un VPN.
+
+### Pouvez-vous m'identifier de manière unique si je dislike ?
+
+Oui. Lorsque vous dislikez une vidéo, nous créons pour vous un identifiant unique généré de manière aléatoire et non lié à votre compte Google. Cette mesure vise à empêcher les robots. Mais il n'y a aucun moyen de lier cet identifiant aléatoire à vous ou à votre compte YouTube personnel.
+
+### Quelles sont les informations dont vous disposez, exactement ?
+
+Juste l'ID de la vidéo. Pas vos commentaires, pas votre nom d'utilisateur, pas les personnes avec qui vous avez partagé la vidéo, pas de métadonnées supplémentaires. Rien. Juste l'ID de la vidéo.
+
+### Comment mon IP est-elle stockée ?
+
+Le backend conserve les adresses IP non hachées uniquement dans la mémoire volatile (RAM). Ces adresses ne sont pas stockées sur un disque dur et ne sont donc pas enregistrées. Nous hachons les adresses IP et stockons ça à la place. Ceci est fait pour empêcher le vandalisme de la base de données.
+
+### J'ai entendu des discussions sur OAuth, et l'accès à mon compte YouTube !
+
+Cette fonctionnalité sera facultative et fera l'objet d'une demande d'adhésion. Si vous êtes un créateur YouTube et que vous souhaitez partager vos statistiques de dislikes avec nous, vous pouvez le faire. La façon dont [OAuth](https://fr.wikipedia.org/wiki/OAuth) a été structuré, c'est en fait très sûr. Vous pouvez révoquer l'accès à votre compte à tout moment et nous donner des autorisations très spécifiques. Nous ne demanderons pas d'autorisations qui ne sont pas nécessaires. Nous ne vous demanderons que l'autorisation de consulter les statistiques de vos vidéos.
+
+### Comment puis-je faire confiance à ce compte de dislikes ?
+
+Nous avons mis en place des mesures pour prévenir les attaques de robots et nous allons continuer à travailler pour améliorer l'efficacité du système de prévention des robots : cela nous aidera à faire en sorte que le nombre de dislikes soit une bonne représentation du nombre réel. Bien entendu, il ne sera jamais précis à 100 %, c'est donc à vous de décider si vous lui faites confiance ou non.
+
+### Pourquoi ne pas partager le code du backend ?
+
+Nous la partagerons à un moment donné - mais il n'y a pas vraiment de raison de la partager pour le moment. Cela donne un faux sentiment de sécurité, car dans un système zero-trust, nous pourrions tout aussi bien publier une version et en déployer une autre. Il y a de nombreuses raisons de garder le code caché, notamment pour lutter contre le spam. Cacher/dissimuler le code de traitement du spam est une pratique assez standard. \ No newline at end of file
diff --git a/Docs/SECURITY-FAQru.md b/Docs/SECURITY-FAQru.md
new file mode 100644
index 0000000..f69257e
--- /dev/null
+++ b/Docs/SECURITY-FAQru.md
@@ -0,0 +1,31 @@
+Прочитать на других языках: [English](SECURITY-FAQ.md)
+
+# Безопасность
+
+### Вы отслеживаете мою историю просмотров?
+
+Нет. Код расширения находится в открытом доступе, и вы можете ознакомиться с ним самостоятельно. Единственная передаваемая информация - это идентификатор видео, который необходим для получения данных о количестве просмотров видео. Никаких дополнительных заголовков не передаётся. На коммуникационном уровне серверу будет передан ваш публичный IP-адрес, а также время, когда был сделан запрос. Однако ничто из этого не идентифицирует вас каким-либо образом. Предполагая среду с нулевым доверием, лучшее, что мы можем получить, это динамический IP. Который сегодня ваш, а завтра - вашего соседа. Если вы действительно беспокоитесь о том, что ваш IP может быть отслежен, вы, вероятно, уже используете какой-нибудь VPN.
+
+### Можете ли вы однозначно идентифицировать меня, если я оставил отметку «Не нравится»?
+
+Да. Когда вы оставляете видео отметку «Не нравится», мы создаём для вас случайно созданный уникальный идентификатор, который не привязан к вашему аккаунту Google. Это делается для избежания ботов. Но нет никакого способа привязать этот случайный идентификатор к вам или вашему личному аккаунту YouTube.
+
+### Какой именно информацией вы располагаете?
+
+Только идентификатор видео. Ни ваших комментариев, ни вашего имени пользователя, ни того, с кем вы поделились видео, ни каких-либо дополнительных метаданных. Ничего. Только идентификатор видео.
+
+### Как хранится мой IP-адрес?
+
+Внутренняя часть нашего сервера хранит нехешированные IP-адреса только в энергозависимой памяти (ОЗУ). Эти адреса не хранятся на жёстком диске и поэтому не регистрируются. Мы хэшируем IP-адреса, и оно хранится вместо них. Это сделано для предотвращения вандализма в базе данных.
+
+### Я слышал обсуждение OAuth и доступа к моему аккаунту на YouTube!
+
+Эта функция будет необязательной и очень нужной. Если вы являетесь создателем YouTube и хотите поделиться с нами статистикой отметок «Не нравится», вы можете это сделать. По своей структуре [OAuth](https://ru.wikipedia.org/wiki/OAuth#:~:text=%D0%B1%D0%B5%D0%B7%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B8%20%D0%B5%D0%B9%20(%D1%82%D1%80%D0%B5%D1%82%D1%8C%D0%B5%D0%B9%20%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%B5)%20%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD%D0%B0%20%D0%B8%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8F) очень безопасен. Вы можете отозвать доступ к своему аккаунту в любое время, и можете дать нам ограниченные разрешения. Мы не будем запрашивать никаких разрешений, которые не требуются. Мы будем запрашивать разрешения только для просмотра статистики ваших видео.
+
+### Как я могу доверять этому счётчику отметок «Не нравится»?
+
+Мы приняли меры по предотвращению атак ботов и собираемся продолжать работать над повышением эффективности системы предотвращения ботов: это поможет нам сохранить подсчёт отметок «Не нравится» как хороший представитель фактического количества. Конечно, он никогда не будет точным на 100%, поэтому вы сами решаете, доверять ему или нет.
+
+### Почему бы вам не поделиться кодом внутренней части своего сервера?
+
+Мы поделимся им в какой-то момент - но сейчас нет никаких реальных причин делиться ею. Это даёт ложное чувство безопасности - ведь в системе с нулевым доверием мы можем с таким же успехом раскрыть одну версию, но развернуть другую. Есть много причин держать код в тайне, в частности, как мы боремся со спамом. Скрытие и запутывание кода обработки спама - это довольно стандартная практика.
diff --git a/Docs/readme.md b/Docs/readme.md
index 52567fb..5a802b2 100644
--- a/Docs/readme.md
+++ b/Docs/readme.md
@@ -1,3 +1,5 @@
+Read this in other languages: [Français](readmefr.md)
+
**Contents**
- [Guides](#guides)
diff --git a/Docs/readmefr.md b/Docs/readmefr.md
new file mode 100644
index 0000000..3d5dd5d
--- /dev/null
+++ b/Docs/readmefr.md
@@ -0,0 +1,39 @@
+Lisez ceci dans d'autres langues : [English](readme.md)
+
+**Contenu**
+
+- [Guides](#guides)
+- [FAQ](#faq)
+<!-- - [Autres listes](#autres-listes) -->
+
+<br>
+
+## Guides
+
+- [Téléchargement, installation et utilisation](https://github.com/Anarios/return-youtube-dislike/wiki/T%C3%A9l%C3%A9chargement,-installation-et-utilisation)
+- [Dépannage](https://github.com/Anarios/return-youtube-dislike/wiki/Guide-de-d%C3%A9pannage)
+<!-- - [FAQ](FAQfr.md)
+- [Quand et comment signaler les bugs](Guide__Bug_Reportingfr.md)
+- [Contribution](/CONTRIBUTINGfr.md) -->
+<!-- - [Comment mettre à jour le wiki](/) -->
+
+<br>
+
+
+## FAQ
+
+- [Général](FAQfr.md)
+- [Sécurité](SECURITY-FAQfr.md)
+
+<!-- - [Vie privée](FAQ_Privacyfr.md)
+- [Technique](FAQ_Technicalfr.md)
+- [Créateurs](FAQ_Creatorsfr.md)
+
+<br>
+
+## Autres listes
+
+- [Problèmes courants](Common_Problemsfr.md)
+- [Questions répétitives](Repeated_Questionsfr.md)
+- [Demandes répétitives de fonctionnalités](Repeated_Feature_requestsfr.md)
+- [Questions répétitives](Repeated_Issuesfr.md) --> \ No newline at end of file
diff --git a/Extensions/UserScript/Return Youtube Dislike.user.js b/Extensions/UserScript/Return Youtube Dislike.user.js
index 476561b..453c56e 100644
--- a/Extensions/UserScript/Return Youtube Dislike.user.js
+++ b/Extensions/UserScript/Return Youtube Dislike.user.js
@@ -33,6 +33,7 @@ const extConfig = {
colorTheme: "classic", // [classic*, accessible, neon] Color theme (red/green, blue/yellow, pink/cyan)
numberDisplayFormat: "compactShort", // [compactShort*, compactLong, standard] Number format (For non-English locale users, you may be able to improve appearance with a different option. Please file a feature request if your locale is not covered)
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)
// END USER OPTIONS
};
@@ -203,10 +204,10 @@ function getLikeCountFromButton() {
if (isShorts()) {
//Youtube Shorts don't work with this query. It's not nessecary; we can skip it and still see the results.
//It should be possible to fix this function, but it's not critical to showing the dislike count.
- return 0;
+ return false;
}
let likesStr = getLikeButton()
- .querySelector("button")
+ .querySelector("yt-formatted-string#text")
.getAttribute("aria-label")
.replace(/\D/g, "");
return likesStr.length > 0 ? parseInt(likesStr) : false;
@@ -262,6 +263,32 @@ function createRateBar(likes, dislikes) {
const widthPercent =
likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
+ var likePercentage = parseFloat(widthPercent.toFixed(1));
+ const dislikePercentage = (100 - likePercentage).toLocaleString();
+ likePercentage = likePercentage.toLocaleString();
+
+ var tooltipInnerHTML;
+ switch (extConfig.tooltipPercentageMode) {
+ case "dash_like":
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${likePercentage}%`
+ break;
+ case "dash_dislike":
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${dislikePercentage}%`
+ break;
+ case "both":
+ tooltipInnerHTML = `${likePercentage}%&nbsp;/&nbsp;${dislikePercentage}%`
+ break;
+ case "only_like":
+ tooltipInnerHTML = `${likePercentage}%`
+ break;
+ case "only_dislike":
+ tooltipInnerHTML = `${dislikePercentage}%`
+ break;
+ default:
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`
+ }
+
+
if (!rateBar && !isMobile) {
let colorLikeStyle = "";
let colorDislikeStyle = "";
@@ -269,7 +296,7 @@ function createRateBar(likes, dislikes) {
colorLikeStyle = "; background-color: " + getColorFromTheme(true);
colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
}
-
+
document.getElementById("menu-container").insertAdjacentHTML(
"beforeend",
`
@@ -286,7 +313,7 @@ function createRateBar(likes, dislikes) {
</div>
</div>
<tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
- <!--css-build:shady-->${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}
+ <!--css-build:shady-->${tooltipInnerHTML}
</tp-yt-paper-tooltip>
</div>
`
@@ -300,8 +327,8 @@ function createRateBar(likes, dislikes) {
document.querySelector(
"#ryd-dislike-tooltip > #tooltip"
- ).innerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`;
-
+ ).innerHTML = tooltipInnerHTML;
+
if (extConfig.coloredBar) {
document.getElementById("return-youtube-dislike-bar-container").style.backgroundColor =
getColorFromTheme(false);
@@ -372,6 +399,12 @@ function likeClicked() {
createRateBar(likesvalue, dislikesvalue);
previousState = 1;
}
+ if (extConfig.numberDisplayReformatLikes === true) {
+ const nativeLikes = getLikeCountFromButton();
+ if (nativeLikes !== false) {
+ setLikes(numberFormat(nativeLikes));
+ }
+ }
}
}
@@ -393,6 +426,12 @@ function dislikeClicked() {
setDislikes(numberFormat(dislikesvalue));
createRateBar(likesvalue, dislikesvalue);
previousState = 2;
+ if (extConfig.numberDisplayReformatLikes === true) {
+ const nativeLikes = getLikeCountFromButton();
+ if (nativeLikes !== false) {
+ setLikes(numberFormat(nativeLikes));
+ }
+ }
}
}
}
@@ -434,32 +473,38 @@ function roundDown(num) {
}
function numberFormat(numberState) {
- let userLocales;
- try {
- userLocales = new URL(
- Array.from(document.querySelectorAll("head > link[rel='search']"))
- ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
- ?.getAttribute("href")
- )?.searchParams?.get("locale");
- } catch {
- userLocales = document.documentElement.lang;
- }
-
let numberDisplay;
if (extConfig.numberDisplayRoundDown === false) {
numberDisplay = numberState;
} else {
numberDisplay = roundDown(numberState);
}
- return getNumberFormatter(extConfig.numberDisplayFormat, userLocales).format(
+ return getNumberFormatter(extConfig.numberDisplayFormat).format(
numberDisplay
);
}
-function getNumberFormatter(optionSelect, userLocales) {
+function getNumberFormatter(optionSelect) {
+ let userLocales;
+ if (document.documentElement.lang) {
+ userLocales = document.documentElement.lang;
+ } else if (navigator.language) {
+ userLocales = navigator.language;
+ } else {
+ try {
+ userLocales = new URL(
+ Array.from(document.querySelectorAll("head > link[rel='search']"))
+ ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
+ ?.getAttribute("href")
+ )?.searchParams?.get("locale");
+ } catch {
+ cLog('Cannot find browser locale. Use en as default for number formatting.');
+ userLocales = 'en';
+ }
+ }
+
let formatterNotation;
let formatterCompactDisplay;
-
switch (optionSelect) {
case "compactLong":
formatterNotation = "compact";
@@ -476,7 +521,7 @@ function getNumberFormatter(optionSelect, userLocales) {
}
const formatter = Intl.NumberFormat(
- document.documentElement.lang || userLocales || navigator.language,
+ userLocales,
{
notation: formatterNotation,
compactDisplay: formatterCompactDisplay,
@@ -516,7 +561,7 @@ function getColorFromTheme(voteIsLike) {
function setEventListeners(evt) {
let jsInitChecktimer;
- function checkForJS_Finish(check) {
+ function checkForJS_Finish() {
console.log();
if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) {
const buttons = getButtons();
diff --git a/Extensions/combined/_locales/en/messages.json b/Extensions/combined/_locales/en/messages.json
index 8dfa32b..a5ba9c0 100644
--- a/Extensions/combined/_locales/en/messages.json
+++ b/Extensions/combined/_locales/en/messages.json
@@ -23,6 +23,9 @@
"linkHelp": {
"message": "Help"
},
+ "linkChangelog": {
+ "message": "Change Log"
+ },
"legendSettings": {
"message": "Settings"
},
@@ -30,16 +33,55 @@
"message": "Disable like/dislike submission"
},
"textLikesDisabled": {
- "message": "disabled by owner"
+ "message": "Disabled by Owner"
},
"textSettingsHover": {
"message": "Stops counting your likes and dislikes."
},
+ "textRoundingNumbers": {
+ "message": "Round down like/dislike stats (default YouTube behavior)"
+ },
+ "textRoundingNumbersHover": {
+ "message": "Show rounded down stats."
+ },
+ "textConsistentFormat": {
+ "message": "Make likes and dislikes format consistent"
+ },
+ "textConsistentFormatHover": {
+ "message": "Re-format like numbers."
+ },
+ "textNumberFormat": {
+ "message": "Number format:"
+ },
+ "textColorizeRatioBar": {
+ "message": "Colorize ratio bar"
+ },
+ "textColorizeRatioBarHover": {
+ "message": "Use custom colors for ratio bar."
+ },
+ "textColorizeThumbs": {
+ "message": "Colorize thumbs"
+ },
+ "textColorizeThumbsHover": {
+ "message": "Use custom colors for thumb icons."
+ },
+ "textColorTheme": {
+ "message": "Color theme:"
+ },
+ "textColorTheme1": {
+ "message": "Classic"
+ },
+ "textColorTheme2": {
+ "message": "Accessible"
+ },
+ "textColorTheme3": {
+ "message": "Neon"
+ },
"textTempUnavailable": {
- "message": "temporarily unavailable"
+ "message": "Temporarily Unavailable"
},
"textUpdate": {
- "message": "update to"
+ "message": "Update to"
},
"version30installed": {
"message": "Version 3.0.0.1 installed"
diff --git a/Extensions/combined/_locales/es/messages.json b/Extensions/combined/_locales/es/messages.json
index 5e0d55c..121c0ee 100644
--- a/Extensions/combined/_locales/es/messages.json
+++ b/Extensions/combined/_locales/es/messages.json
@@ -1,15 +1,15 @@
{
"extensionName": {
- "message": "Regresar los Dislikes de YouTube"
+ "message": "Return YouTube Dislike"
},
"extensionNameBeta": {
"message": "Return YouTube Dislike Beta"
},
"extensionDesc": {
- "message": "Regresa la posibilidad de ver los dislikes"
+ "message": "Recupera la característica de los «dislikes» («No me gusta»)"
},
"textDeveloper": {
- "message": "por Dmitry Selivanov y la Comunidad"
+ "message": "por Dmitry Selivanov y la comunidad"
},
"linkWebsite": {
"message": "Página web"
@@ -23,14 +23,62 @@
"linkHelp": {
"message": "Ayuda"
},
+ "linkChangelog": {
+ "message": "Historial de cambios"
+ },
"legendSettings": {
"message": "Ajustes"
},
"textSettings": {
- "message": "Desactivar los dislikes"
+ "message": "Desactivar envío de votos"
+ },
+ "textLikesDisabled": {
+ "message": "desactivado por el propietario"
},
"textSettingsHover": {
- "message": "Dejar de contar los dislikes."
+ "message": "Deja de contar tus «Me gusta» y «No me gusta»."
+ },
+ "textRoundingNumbers": {
+ "message": "Redondear cifras (comportamiento original de YouTube)"
+ },
+ "textRoundingNumbersHover": {
+ "message": "Muestra las estadísticas redondeadas."
+ },
+ "textConsistentFormat": {
+ "message": "Unificar formato de votos"
+ },
+ "textConsistentFormatHover": {
+ "message": "Cambia el formato de las cifras de «Me gusta» y «No me gusta»."
+ },
+ "textNumberFormat": {
+ "message": "Formato de cifras:"
+ },
+ "textColorizeRatioBar": {
+ "message": "Cambiar color de barra de votos"
+ },
+ "textColorizeRatioBarHover": {
+ "message": "Utiliza colores personalizados para la barra de votos."
+ },
+ "textColorizeThumbs": {
+ "message": "Cambiar color de iconos de pulgares"
+ },
+ "textColorizeThumbsHover": {
+ "message": "Utiliza colores personalizados para los iconos de los pulgares."
+ },
+ "textColorTheme": {
+ "message": "Esquema de colores:"
+ },
+ "textColorTheme1": {
+ "message": "Clásico"
+ },
+ "textColorTheme2": {
+ "message": "Accesible"
+ },
+ "textColorTheme3": {
+ "message": "Neón"
+ },
+ "textTempUnavailable": {
+ "message": "no disponible temporalmente"
},
"textUpdate": {
"message": "actualizar a"
diff --git a/Extensions/combined/_locales/pt_BR/messages.json b/Extensions/combined/_locales/pt_BR/messages.json
index 26f40f3..fa6c75a 100644
--- a/Extensions/combined/_locales/pt_BR/messages.json
+++ b/Extensions/combined/_locales/pt_BR/messages.json
@@ -1,21 +1,21 @@
{
"extensionName": {
- "message": "Devolver Dislikes do YouTube"
+ "message": "Voltar Dislikes do YouTube"
},
"extensionNameBeta": {
- "message": "Return YouTube Dislike Beta"
+ "message": "Voltar Dislikes do YouTube Beta"
},
"extensionDesc": {
- "message": "A capacidade de ver os retornos de não gostos"
+ "message": "Voltar os Deslikes do YouTube"
},
"textDeveloper": {
- "message": "por Dmitry Selivanov e a Comunidade"
+ "message": "por Dmitry Selivanov e Comunidade"
},
"linkWebsite": {
"message": "Website"
},
"linkFAQ": {
- "message": "FAQ"
+ "message": "Perguntas Frequentes"
},
"linkDonate": {
"message": "Doe"
@@ -24,15 +24,39 @@
"message": "Ajuda"
},
"legendSettings": {
- "message": "Ajustes"
+ "message": "Configurações"
},
"textSettings": {
- "message": "Desaproveitar as aversões"
+ "message": "Desativar envio de Curtidas/Não Curtidas"
+ },
+ "textLikesDisabled": {
+ "message": "Desativado pelo proprietário"
},
"textSettingsHover": {
- "message": "Pare de contar as antipatias."
+ "message": "Parar de contar suas curtidas e não curtidas."
+ },
+ "textTempUnavailable": {
+ "message": "Temporariamente indisponível"
},
"textUpdate": {
- "message": "atualização para"
+ "message": "Atualizar para"
+ },
+ "version30installed": {
+ "message": "Versão 3.0.0.1 instalada"
+ },
+ "whatsnew": {
+ "message": "O que há de novo?"
+ },
+ "shortsSupport": {
+ "message": "Suporte para Shorts"
+ },
+ "customColors": {
+ "message": "Cores personalizadas para barra de não curtidas e botões"
+ },
+ "customNumberFormats": {
+ "message": "Formato de números personalizados"
+ },
+ "considerDonating": {
+ "message": "A única coisa que mantém a extensão funcionando são suas doações, considere apoiar o projeto."
}
-}
+} \ No newline at end of file
diff --git a/Extensions/combined/_locales/tr/messages.json b/Extensions/combined/_locales/tr/messages.json
index 9f4b7ba..d2b2f89 100644
--- a/Extensions/combined/_locales/tr/messages.json
+++ b/Extensions/combined/_locales/tr/messages.json
@@ -45,7 +45,7 @@
"message": "Sürüm 3.0.0.1 yüklendi"
},
"whatsnew": {
- "message": "Yenilikler:"
+ "message": "Yeni Ne Var"
},
"shortsSupport": {
"message": "YouTube Shorts Desteği"
@@ -60,4 +60,3 @@
"message": "Uzantının var olmasını sağlayan tek şey bağışlarınızdır, lütfen projeyi desteklemeyi düşünün."
}
}
- \ No newline at end of file
diff --git a/Extensions/combined/popup.css b/Extensions/combined/popup.css
index dfe94cb..2ff8516 100644
--- a/Extensions/combined/popup.css
+++ b/Extensions/combined/popup.css
@@ -15,7 +15,8 @@ html,
body {
background-color: var(--background);
color: var(--white);
- min-width: 300px;
+ min-width: 310px;
+ min-height: 350px;
padding: 0.5em;
font-family: "Roboto", Arial, Helvetica, sans-serif;
font-size: 14px;
@@ -68,9 +69,12 @@ button:hover {
border-radius: 0.25rem;
}
-.switch:before {
+
+.switch::before, .label-with-hover-tip::before {
content: attr(data-hover);
visibility: hidden;
+ opacity: 0;
+ transition: visibility 0.1s linear, opacity 0.1s linear;
width: 250px;
background-color: var(--secondary);
border-radius: 0.5rem;
@@ -82,8 +86,27 @@ button:hover {
top: 160%;
}
-.switch:hover:before {
+
+.switch:hover::before, .label-with-hover-tip:hover::before {
visibility: visible;
+ opacity: 1;
+}
+
+.fade-in {
+ opacity: 1;
+ animation-name: fadeInOpacity;
+ animation-iteration-count: 1;
+ animation-timing-function: ease-in;
+ animation-duration: 2s;
+}
+
+@keyframes fadeInOpacity {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
}
#advancedToggle {
@@ -123,6 +146,32 @@ button:hover {
border: 2px solid var(--secondary);
border-radius: 0.5rem;
padding: 1rem;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+::-webkit-scrollbar {
+ width: 1rem;
+}
+
+::-webkit-scrollbar-track {
+ background: #111; /* color of the tracking area */
+}
+
+::-webkit-scrollbar-thumb {
+ background-color: #333; /* color of the scroll thumb */
+ border-radius: 1rem 0 0 1rem; /* roundness of the scroll thumb */
+ border-bottom: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-left: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-top: 0.25rem solid #111; /* creates padding around scroll thumb */
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background-color: #f22; /* color of the scroll thumb */
+ border-radius: 1rem 0 0 1rem; /* roundness of the scroll thumb */
+ border-bottom: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-left: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-top: 0.25rem solid #111; /* creates padding around scroll thumb */
}
#advancedLegend {
@@ -142,6 +191,14 @@ button:hover {
margin-bottom: 1rem;
}
+.label-with-hover-tip {
+ position: relative;
+ display: inline-block;
+ width: 80px;
+ height: 17px;
+ margin-bottom: 1rem;
+}
+
.switch:last-of-type {
margin-bottom: 0;
}
@@ -162,7 +219,7 @@ button:hover {
border-radius: 34px;
}
-.slider:before {
+.slider::before {
position: absolute;
content: "";
height: 13px;
@@ -178,7 +235,7 @@ input:checked + .slider {
background: var(--accent);
}
-input:checked + .slider:before {
+input:checked + .slider::before {
transform: translateX(13px);
background: var(--primary);
}
diff --git a/Extensions/combined/popup.html b/Extensions/combined/popup.html
index 38b5c0d..8318901 100644
--- a/Extensions/combined/popup.html
+++ b/Extensions/combined/popup.html
@@ -44,7 +44,7 @@
</button>
<br>
<button style="margin-top: 0.3em" id="link_changelog" title="__MSG_linkChangelog__">
- Change Log
+ __MSG_linkChangelog__
</button>
<br/>
@@ -94,7 +94,7 @@
__MSG_legendSettings__
</legend>
- <label class="switch" data-hover="__MSG_textSettingsHover__">
+ <label class="switch" data-hover="Stop counting your likes and dislikes">
<input type="checkbox" id="disable_vote_submission"/>
<span class="slider" />
<span class="switchLabel" title="__MSG_textSettings__">
@@ -139,11 +139,9 @@
<div class="custom-select">
<label for="color_theme">__MSG_colorTheme__</label>
<select name="color_theme" id="color_theme">
- <option value="classic" id="color_theme_classic">Classic</option>
- <option value="accessible" id="color_theme_accessible">
- Accessible
- </option>
- <option value="neon" id="color_theme_neon">Neon</option>
+ <option value="classic" id="color_theme_classic">"__MSG_textColorTheme1__"</option>
+ <option value="accessible" id="color_theme_accessible">"__MSG_textColorTheme2__"</option>
+ <option value="neon" id="color_theme_neon">"__MSG_textColorTheme3__"</option>
</select>
<span
id="color_theme_example_like"
@@ -164,6 +162,22 @@
"
>&nbsp;</span>
</div>
+ <br/>
+ <label class="switch" data-hover="Display percentage in like/dislike bar tooltip.">
+ <input type="checkbox" id="show_tooltip_percentage"/>
+ <span class="slider"/>
+ <span class="switchLabel">Percentage in like/dislike bar tooltip.</span>
+ </label>
+ <div class="custom-select">
+ <label for="tooltip_percentage_mode" data-hover="Use custom percentage display on hover.">Percent mode:</label>
+ <select name="tooltip_percentage_mode" id="tooltip_percentage_mode">
+ <option value="dash_like" id="tooltip_percentage_mode_dash_like">190&nbsp;/&nbsp;10&nbsp;&nbsp;-&nbsp;&nbsp;95%</option>
+ <option value="dash_dislike" id="tooltip_percentage_mode_dash_dislike">190&nbsp;/&nbsp;10&nbsp;&nbsp;-&nbsp;&nbsp;5%</option>
+ <option value="both" id="tooltip_percentage_mode_both">95%&nbsp;/&nbsp;5%</option>
+ <option value="only_like" id="tooltip_percentage_mode_only_like">95%</option>
+ <option value="only_dislike" id="tooltip_percentage_mode_only_dislike">5%</option>
+ </select>
+ </div>
</fieldset>
</body>
<script src="popup.js"></script>
diff --git a/Extensions/combined/popup.js b/Extensions/combined/popup.js
index 2fb0db7..30741dd 100644
--- a/Extensions/combined/popup.js
+++ b/Extensions/combined/popup.js
@@ -1,3 +1,5 @@
+import { cLog } from "./src/utils";
+
/* Config */
const config = {
advanced: false,
@@ -7,7 +9,9 @@ const config = {
colorTheme: "classic",
numberDisplayFormat: "compactShort",
numberDisplayRoundDown: true,
- numberDisplayReformatLikes: false,
+ showTooltipPercentage: false,
+ tooltipPercentageMode: "dash_like",
+ numberDisplayReformatLikes: false,
showAdvancedMessage:
'<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"><rect fill="none" height="24" width="24"/><path d="M19.5,12c0-0.23-0.01-0.45-0.03-0.68l1.86-1.41c0.4-0.3,0.51-0.86,0.26-1.3l-1.87-3.23c-0.25-0.44-0.79-0.62-1.25-0.42 l-2.15,0.91c-0.37-0.26-0.76-0.49-1.17-0.68l-0.29-2.31C14.8,2.38,14.37,2,13.87,2h-3.73C9.63,2,9.2,2.38,9.14,2.88L8.85,5.19 c-0.41,0.19-0.8,0.42-1.17,0.68L5.53,4.96c-0.46-0.2-1-0.02-1.25,0.42L2.41,8.62c-0.25,0.44-0.14,0.99,0.26,1.3l1.86,1.41 C4.51,11.55,4.5,11.77,4.5,12s0.01,0.45,0.03,0.68l-1.86,1.41c-0.4,0.3-0.51,0.86-0.26,1.3l1.87,3.23c0.25,0.44,0.79,0.62,1.25,0.42 l2.15-0.91c0.37,0.26,0.76,0.49,1.17,0.68l0.29,2.31C9.2,21.62,9.63,22,10.13,22h3.73c0.5,0,0.93-0.38,0.99-0.88l0.29-2.31 c0.41-0.19,0.8-0.42,1.17-0.68l2.15,0.91c0.46,0.2,1,0.02,1.25-0.42l1.87-3.23c0.25-0.44,0.14-0.99-0.26-1.3l-1.86-1.41 C19.49,12.45,19.5,12.23,19.5,12z M12.04,15.5c-1.93,0-3.5-1.57-3.5-3.5s1.57-3.5,3.5-3.5s3.5,1.57,3.5,3.5S13.97,15.5,12.04,15.5z"/></svg>',
hideAdvancedMessage:
@@ -86,6 +90,14 @@ document.getElementById("number_format").addEventListener("change", (ev) => {
chrome.storage.sync.set({ numberDisplayFormat: ev.target.value });
});
+document.getElementById("show_tooltip_percentage").addEventListener("click", (ev) => {
+ chrome.storage.sync.set({ showTooltipPercentage: ev.target.checked });
+});
+
+document.getElementById("tooltip_percentage_mode").addEventListener("change", (ev) => {
+ chrome.storage.sync.set({ tooltipPercentageMode: ev.target.value });
+});
+
document.getElementById("number_reformat_likes").addEventListener("click", (ev) => {
chrome.storage.sync.set({ numberDisplayReformatLikes: ev.target.checked });
});
@@ -99,14 +111,13 @@ advancedToggle.addEventListener("click", () => {
adv.style.pointerEvents = "none";
adv.style.opacity = "0";
advancedToggle.innerHTML = config.showAdvancedMessage;
- config.advanced = false;
} else {
adv.style.transform = "scale(1)";
adv.style.pointerEvents = "auto";
adv.style.opacity = "1";
advancedToggle.innerHTML = config.hideAdvancedMessage;
- config.advanced = true;
}
+ config.advanced = !config.advanced;
});
initConfig();
@@ -119,6 +130,8 @@ function initConfig() {
initializeColorTheme();
initializeNumberDisplayFormat();
initializeNumberDisplayRoundDown();
+ initializeTooltipPercentage();
+ initializeTooltipPercentageMode();
initializeNumberDisplayReformatLikes();
}
@@ -190,6 +203,18 @@ function initializeNumberDisplayRoundDown() {
});
}
+function initializeTooltipPercentage(){
+ chrome.storage.sync.get(["showTooltipPercentage"], (res) => {
+ handleShowTooltipPercentageChangeEvent(res.showTooltipPercentage);
+ });
+};
+
+function initializeTooltipPercentageMode() {
+ chrome.storage.sync.get(["tooltipPercentageMode"], (res) => {
+ handleTooltipPercentageModeChangeEvent(res.tooltipPercentageMode);
+ });
+};
+
function initializeNumberDisplayFormat() {
chrome.storage.sync.get(["numberDisplayFormat"], (res) => {
handleNumberDisplayFormatChangeEvent(res.numberDisplayFormat);
@@ -243,6 +268,9 @@ function storageChangeHandler(changes, area) {
if (changes.numberDisplayFormat !== undefined) {
handleNumberDisplayFormatChangeEvent(changes.numberDisplayFormat.newValue);
}
+ if (changes.showTooltipPercentage !== undefined) {
+ handleShowTooltipPercentageChangeEvent(changes.showTooltipPercentage.newValue);
+ }
if (changes.numberDisplayReformatLikes !== undefined) {
handleNumberDisplayReformatLikesChangeEvent(changes.numberDisplayReformatLikes.newValue);
}
@@ -293,6 +321,22 @@ function handleNumberDisplayFormatChangeEvent(value) {
.querySelector('option[value="' + value + '"]').selected = true;
}
+function handleShowTooltipPercentageChangeEvent(value) {
+ config.showTooltipPercentage = value;
+ document.getElementById("show_tooltip_percentage").checked = value;
+};
+
+function handleTooltipPercentageModeChangeEvent(value) {
+ if (!value) {
+ value = "dash_like";
+ }
+ config.tooltipPercentageMode = value;
+
+ document
+ .getElementById("tooltip_percentage_mode")
+ .querySelector('option[value="' + value + '"]').selected = true;
+};
+
function handleNumberDisplayReformatLikesChangeEvent(value) {
config.numberDisplayReformatLikes = value;
document.getElementById("number_reformat_likes").checked = value;
diff --git a/Extensions/combined/ryd.background.js b/Extensions/combined/ryd.background.js
index 75f22ae..b6b6b67 100644
--- a/Extensions/combined/ryd.background.js
+++ b/Extensions/combined/ryd.background.js
@@ -77,6 +77,8 @@ api.runtime.onInstalled.addListener((details) => {
if (
// No need to show changelog if its was a browser update (and not extension update)
details.reason === "browser_update" ||
+ // Chromium (e.g., Google Chrome Cannary) uses this name instead of the one above for some reason
+ details.reason === "chrome_update" ||
// No need to show changelog if developer just reloaded the extension
details.reason === "update"
)
@@ -277,6 +279,12 @@ function storageChangeHandler(changes, area) {
changes.numberDisplayReformatLikes.newValue
);
}
+ if (changes.showTooltipPercentage !== undefined) {
+ handleShowTooltipPercentageChangeEvent(changes.showTooltipPercentage.newValue);
+ }
+ if (changes.numberDisplayReformatLikes !== undefined) {
+ handleNumberDisplayReformatLikesChangeEvent(changes.numberDisplayReformatLikes.newValue);
+ }
}
function handleDisableVoteSubmissionChangeEvent(value) {
@@ -292,6 +300,17 @@ function handleNumberDisplayFormatChangeEvent(value) {
extConfig.numberDisplayFormat = value;
}
+function handleShowTooltipPercentageChangeEvent(value) {
+ extConfig.showTooltipPercentage = value;
+};
+
+function handleTooltipPercentageModeChangeEvent(value) {
+ if (!value) {
+ value = "dash_like";
+ }
+ extConfig.tooltipPercentageMode = value;
+};
+
function handleNumberDisplayRoundDownChangeEvent(value) {
extConfig.numberDisplayRoundDown = value;
}
@@ -333,6 +352,8 @@ function initExtConfig() {
initializeNumberDisplayFormat();
initializeNumberDisplayRoundDown();
initializeNumberDisplayReformatLikes();
+ initializeTooltipPercentage();
+ initializeTooltipPercentageMode();
}
function initializeDisableVoteSubmission() {
@@ -396,6 +417,26 @@ function initializeNumberDisplayFormat() {
});
}
+function initializeTooltipPercentage() {
+ api.storage.sync.get(["showTooltipPercentage"], (res) => {
+ if (res.showTooltipPercentage === undefined) {
+ api.storage.sync.set({ showTooltipPercentage: false });
+ } else {
+ extConfig.showTooltipPercentage = res.showTooltipPercentage;
+ }
+ });
+}
+
+function initializeTooltipPercentageMode() {
+ api.storage.sync.get(["tooltipPercentageMode"], (res) => {
+ if (res.tooltipPercentageMode === undefined) {
+ api.storage.sync.set({ tooltipPercentageMode: "dash_like" });
+ } else {
+ extConfig.tooltipPercentageMode = res.tooltipPercentageMode;
+ }
+ });
+}
+
function initializeNumberDisplayReformatLikes() {
api.storage.sync.get(["numberDisplayReformatLikes"], (res) => {
if (res.numberDisplayReformatLikes === undefined) {
diff --git a/Extensions/combined/src/bar.js b/Extensions/combined/src/bar.js
index c56ab57..6267ce6 100644
--- a/Extensions/combined/src/bar.js
+++ b/Extensions/combined/src/bar.js
@@ -1,5 +1,5 @@
import { getButtons } from "./buttons";
-import { extConfig, isMobile, isLikesDisabled } from "./state";
+import { extConfig, isMobile, isLikesDisabled, isShorts } from "./state";
import { cLog, getColorFromTheme } from "./utils";
function createRateBar(likes, dislikes) {
@@ -14,49 +14,78 @@ function createRateBar(likes, dislikes) {
const widthPercent =
likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
- if (!rateBar && !isMobile()) {
- let colorLikeStyle = "";
- let colorDislikeStyle = "";
- if (extConfig.coloredBar) {
- colorLikeStyle = "; background-color: " + getColorFromTheme(true);
- colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
- }
+ var likePercentage = parseFloat(widthPercent.toFixed(1));
+ const dislikePercentage = (100 - likePercentage).toLocaleString();
+ likePercentage = likePercentage.toLocaleString();
- (
- document.getElementById("menu-container") ||
- document.querySelector("ytm-slim-video-action-bar-renderer")
- ).insertAdjacentHTML(
- "beforeend",
- `
- <div class="ryd-tooltip" style="width: ${widthPx}px">
- <div class="ryd-tooltip-bar-container">
- <div
- id="ryd-bar-container"
- style="width: 100%; height: 2px;${colorDislikeStyle}"
- >
- <div
- id="ryd-bar"
- style="width: ${widthPercent}%; height: 100%${colorLikeStyle}"
- ></div>
- </div>
- </div>
- <tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
- <!--css-build:shady-->${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}
- </tp-yt-paper-tooltip>
- </div>
- `
- );
+ if (extConfig.showTooltipPercentage) {
+ var tooltipInnerHTML;
+ switch (extConfig.tooltipPercentageMode) {
+ case "dash_dislike":
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${dislikePercentage}%`
+ break;
+ case "both":
+ tooltipInnerHTML = `${likePercentage}%&nbsp;/&nbsp;${dislikePercentage}%`
+ break;
+ case "only_like":
+ tooltipInnerHTML = `${likePercentage}%`
+ break;
+ case "only_dislike":
+ tooltipInnerHTML = `${dislikePercentage}%`
+ break;
+ default: // dash_like
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${likePercentage}%`
+ }
} else {
- document.getElementById("ryd-bar-container").style.width = widthPx + "px";
- document.getElementById("ryd-bar").style.width = widthPercent + "%";
- document.querySelector(
- "#ryd-dislike-tooltip > #tooltip"
- ).innerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`;
- if (extConfig.coloredBar) {
- document.getElementById("ryd-bar-container").style.backgroundColor =
- getColorFromTheme(false);
- document.getElementById("ryd-bar").style.backgroundColor =
- getColorFromTheme(true);
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`
+ }
+
+
+ if (!isShorts()) {
+ if (!rateBar && !isMobile()) {
+ let colorLikeStyle = "";
+ let colorDislikeStyle = "";
+ if (extConfig.coloredBar) {
+ colorLikeStyle = "; background-color: " + getColorFromTheme(true);
+ colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
+ }
+
+ (
+ document.getElementById("menu-container") ||
+ document.querySelector("ytm-slim-video-action-bar-renderer")
+ ).insertAdjacentHTML(
+ "beforeend",
+ `
+ <div class="ryd-tooltip" style="width: ${widthPx}px">
+ <div class="ryd-tooltip-bar-container">
+ <div
+ id="ryd-bar-container"
+ style="width: 100%; height: 2px;${colorDislikeStyle}"
+ >
+ <div
+ id="ryd-bar"
+ style="width: ${widthPercent}%; height: 100%${colorLikeStyle}"
+ ></div>
+ </div>
+ </div>
+ <tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
+ <!--css-build:shady-->${tooltipInnerHTML}
+ </tp-yt-paper-tooltip>
+ </div>
+ `
+ );
+ } else {
+ document.getElementById("ryd-bar-container").style.width = widthPx + "px";
+ document.getElementById("ryd-bar").style.width = widthPercent + "%";
+ document.querySelector(
+ "#ryd-dislike-tooltip > #tooltip"
+ ).innerHTML = tooltipInnerHTML;
+ if (extConfig.coloredBar) {
+ document.getElementById("ryd-bar-container").style.backgroundColor =
+ getColorFromTheme(false);
+ document.getElementById("ryd-bar").style.backgroundColor =
+ getColorFromTheme(true);
+ }
}
}
} else {
diff --git a/Extensions/combined/src/events.js b/Extensions/combined/src/events.js
index 99c7d14..019f166 100644
--- a/Extensions/combined/src/events.js
+++ b/Extensions/combined/src/events.js
@@ -8,6 +8,7 @@ import {
extConfig,
storedData,
setLikes,
+ getLikeCountFromButton,
} from "./state";
import { createRateBar } from "./bar";
@@ -41,6 +42,12 @@ function likeClicked() {
createRateBar(storedData.likes, storedData.dislikes);
storedData.previousState = NEUTRAL_STATE;
}
+ if (extConfig.numberDisplayReformatLikes === true) {
+ const nativeLikes = getLikeCountFromButton();
+ if (nativeLikes !== false) {
+ setLikes(numberFormat(nativeLikes));
+ }
+ }
}
}
@@ -65,6 +72,12 @@ function dislikeClicked() {
setDislikes(numberFormat(storedData.dislikes));
createRateBar(storedData.likes, storedData.dislikes);
storedData.previousState = DISLIKED_STATE;
+ if (extConfig.numberDisplayReformatLikes === true) {
+ const nativeLikes = getLikeCountFromButton();
+ if (nativeLikes !== false) {
+ setLikes(numberFormat(nativeLikes));
+ }
+ }
}
}
}
diff --git a/Extensions/combined/src/starRating.js b/Extensions/combined/src/starRating.js
new file mode 100644
index 0000000..5d98814
--- /dev/null
+++ b/Extensions/combined/src/starRating.js
@@ -0,0 +1,101 @@
+import { cLog } from "./utils";
+
+function createStarRating(rating, isMobile) {
+ let starRating = document.createElement('label');
+
+ let starSlider = document.createElement("input");
+ starSlider.setAttribute("class", "rating");
+ starSlider.setAttribute("max", "5");
+ starSlider.setAttribute("readonly", "");
+ starSlider.setAttribute("style", `--fill:rgb(255, 215, 0);--value:${rating.toString()};};background-color: transparent;`);
+ starSlider.setAttribute("type", "range");
+
+ starRating.appendChild(starSlider);
+
+ let YTLikeButton;
+
+ 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)');
+ } else {
+ YTLikeButton = document.querySelector('#top-level-buttons-computed > ytd-toggle-button-renderer:nth-child(1)');
+ }
+
+ YTLikeButton.insertAdjacentElement('afterend', starRating);
+
+ try {
+ let YTBar = document.querySelector('#ryd-bar-container');
+ YTBar.setAttribute("style", "width: 190%; height: 2px;");
+ }
+ catch(err) {
+ cLog("RateBar Not Present");
+ }
+
+
+
+ let style = `<style>
+
+.rating {
+ --dir: right;
+ --fill: gold;
+ --fillbg: rgba(100, 100, 100, 0.15);
+ --star: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 17.25l-6.188 3.75 1.641-7.031-5.438-4.734 7.172-0.609 2.813-6.609 2.813 6.609 7.172 0.609-5.438 4.734 1.641 7.031z"/></svg>');
+ --stars: 5;
+ --starSize: 2.8rem;
+ --symbol: var(--star);
+ --value: 1;
+ --w: calc(var(--stars) * var(--starSize));
+ --x: calc(100% * (var(--value) / var(--stars)));
+ block-size: var(--starSize);
+ inline-size: var(--w);
+ position: relative;
+ touch-action: manipulation;
+ -webkit-appearance: none;
+}
+
+[dir="rtl"] .rating {
+ --dir: left;
+}
+
+.rating::-moz-range-track {
+ background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
+ block-size: 100%;
+ mask: repeat left center/var(--starSize) var(--symbol);
+}
+
+.rating::-webkit-slider-runnable-track {
+ background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
+ block-size: 100%;
+ mask: repeat left center/var(--starSize) var(--symbol);
+ -webkit-mask: repeat left center/var(--starSize) var(--symbol);
+}
+
+.rating::-moz-range-thumb {
+ height: var(--starSize);
+ opacity: 0;
+ width: var(--starSize);
+}
+
+.rating::-webkit-slider-thumb {
+ height: var(--starSize);
+ opacity: 0;
+ width: var(--starSize);
+ -webkit-appearance: none;
+}
+
+.rating,
+.rating-label {
+ display: block;
+ font-family: ui-sans-serif, system-ui, sans-serif;
+}
+
+.rating-label {
+ margin-block-end: 1rem;
+}
+
+</style>`;
+
+document.head.insertAdjacentHTML("beforeend", style);
+
+ }
+
+ export { createStarRating };
diff --git a/Extensions/combined/src/state.js b/Extensions/combined/src/state.js
index df9d561..52f68d4 100644
--- a/Extensions/combined/src/state.js
+++ b/Extensions/combined/src/state.js
@@ -8,6 +8,7 @@ import {
getColorFromTheme,
} from "./utils";
import { localize } from "./utils";
+import { createStarRating } from "./starRating";
//TODO: Do not duplicate here and in ryd.background.js
const apiUrl = "https://returnyoutubedislikeapi.com";
@@ -22,6 +23,8 @@ let extConfig = {
colorTheme: "classic",
numberDisplayFormat: "compactShort",
numberDisplayRoundDown: true,
+ showTooltipPercentage: false,
+ tooltipPercentageMode: "dash_like",
numberDisplayReformatLikes: false,
};
@@ -150,10 +153,10 @@ function getLikeCountFromButton() {
if (isShorts()) {
//Youtube Shorts don't work with this query. It's not nessecary; we can skip it and still see the results.
//It should be possible to fix this function, but it's not critical to showing the dislike count.
- return 0;
+ return false;
}
let likesStr = getLikeButton()
- .querySelector("button")
+ .querySelector("yt-formatted-string#text")
.getAttribute("aria-label")
.replace(/\D/g, "");
return likesStr.length > 0 ? parseInt(likesStr) : false;
@@ -199,6 +202,7 @@ function processResponse(response, storedData) {
getDislikeButton().style.color = getColorFromTheme(false);
}
}
+ createStarRating(response.rating, isMobile());
}
// Tells the user if the API is down
@@ -252,6 +256,8 @@ function initExtConfig() {
initializeColorTheme();
initializeNumberDisplayFormat();
initializeNumberDisplayRoundDown();
+ initializeTooltipPercentage();
+ initializeTooltipPercentageMode();
initializeNumberDisplayReformatLikes();
}
@@ -315,6 +321,26 @@ function initializeNumberDisplayFormat() {
});
}
+function initializeTooltipPercentage() {
+ getBrowser().storage.sync.get(["showTooltipPercentage"], (res) => {
+ if (res.showTooltipPercentage === undefined) {
+ getBrowser().storage.sync.set({ showTooltipPercentage: false });
+ } else {
+ extConfig.showTooltipPercentage = res.showTooltipPercentage;
+ }
+ });
+}
+
+function initializeTooltipPercentageMode() {
+ getBrowser().storage.sync.get(["tooltipPercentageMode"], (res) => {
+ if (res.tooltipPercentageMode === undefined) {
+ getBrowser().storage.sync.set({ tooltipPercentageMode: "dash_like" });
+ } else {
+ extConfig.tooltipPercentageMode = res.tooltipPercentageMode;
+ }
+ });
+}
+
function initializeNumberDisplayReformatLikes() {
getBrowser().storage.sync.get(["numberDisplayReformatLikes"], (res) => {
if (res.numberDisplayReformatLikes === undefined) {
diff --git a/Extensions/combined/src/utils.js b/Extensions/combined/src/utils.js
index a3fe790..53a84d0 100644
--- a/Extensions/combined/src/utils.js
+++ b/Extensions/combined/src/utils.js
@@ -9,15 +9,6 @@ function roundDown(num) {
}
function numberFormat(numberState) {
- let userLocales;
- try {
- userLocales = new URL(
- Array.from(document.querySelectorAll("head > link[rel='search']"))
- ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
- ?.getAttribute("href")
- )?.searchParams?.get("locale");
- } catch {}
-
let numberDisplay;
if (extConfig.numberDisplayRoundDown === false) {
numberDisplay = numberState;
@@ -29,22 +20,27 @@ function numberFormat(numberState) {
);
}
-function localize(localeString) {
- return chrome.i18n.getMessage(localeString);
-}
-
function getNumberFormatter(optionSelect) {
- let formatterNotation;
- let formatterCompactDisplay;
let userLocales;
- try {
- userLocales = new URL(
- Array.from(document.querySelectorAll("head > link[rel='search']"))
- ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
- ?.getAttribute("href")
- )?.searchParams?.get("locale");
- } catch {}
+ if (document.documentElement.lang) {
+ userLocales = document.documentElement.lang;
+ } else if (navigator.language) {
+ userLocales = navigator.language;
+ } else {
+ try {
+ userLocales = new URL(
+ Array.from(document.querySelectorAll("head > link[rel='search']"))
+ ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
+ ?.getAttribute("href")
+ )?.searchParams?.get("locale");
+ } catch {
+ cLog('Cannot find browser locale. Use en as default for number formatting.');
+ userLocales = 'en';
+ }
+ }
+ let formatterNotation;
+ let formatterCompactDisplay;
switch (optionSelect) {
case "compactLong":
formatterNotation = "compact";
@@ -61,7 +57,7 @@ function getNumberFormatter(optionSelect) {
}
const formatter = Intl.NumberFormat(
- document.documentElement.lang || userLocales || navigator.language,
+ userLocales,
{
notation: formatterNotation,
compactDisplay: formatterCompactDisplay,
@@ -70,6 +66,10 @@ function getNumberFormatter(optionSelect) {
return formatter;
}
+function localize(localeString) {
+ return chrome.i18n.getMessage(localeString);
+}
+
function getBrowser() {
if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined") {
return chrome;
diff --git a/README.md b/README.md
index 2eaa87c..418d2bc 100644
--- a/README.md
+++ b/README.md
@@ -7,9 +7,9 @@
[![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)
-# Return YouTube Dislike
+Read this in other languages: [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md)
-Read this in other languages: [русский](READMEru.md), [Español](READMEes.md), [Türkçe](READMEtr.md)
+# Return YouTube Dislike
<p align="center">
<b>Return YouTube Dislike is an open-source extension that returns the YouTube dislike count.</b><br>
diff --git a/READMEes.md b/READMEes.md
index b64c986..e9fc6df 100644
--- a/READMEes.md
+++ b/READMEes.md
@@ -7,50 +7,48 @@
[![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)
-Leer en otros idiomas:
-
-# Return YouTube Dislike
+Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Français](READMEfr.md) [日本語](READMEja.md), [Türkçe](READMEtr.md)
-Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Türkçe](READMEtr.md)
+# Return YouTube Dislike
<p align="center">
- <b>Return YouTube Dislike es una extensión de código abierto que regresa el contador de dislikes.</b><br>
- Disponible para Chrome y Firefox cómo una extensión web.<br>
- También disponible para otros navegadores cómo un Userscript de JS.<br><br>
+ <b>Return YouTube Dislike (recuperar los *dislikes* de YouTube) es una extensión de código abierto que reintroduce el contador de *dislikes* (o «No me gustas»).</b><br>
+ Está disponible para Chrome y Firefox como una extensión web.<br>
+ También está disponible para otros navegadores como un *userscript* de JS.<br><br>
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
</p>
## La historia
-El 10 de Noviembre de 2021, Google [anunció](https://blog.youtube/news-and-events/update-to-youtube/) que el contador de dislikes de YouTube sería eliminado.
+El 10 de noviembre de 2021, Google [anunció](https://blog.youtube/news-and-events/update-to-youtube/) que eliminarían el contador de *dislikes* de YouTube.
-Adicionalmente, el campo de 'dislike' en la API de YouTube fue [eliminado](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) el 13 de Diciembre de 2021, acabando con la habilidad de juzgar la calidad del contenido antes de verlo.
+Adicionalmente, el campo `dislike` de la API de YouTube también fue [eliminado](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) el 13 de diciembre de 2021, acabando con la posibilidad de juzgar la calidad de un contenido antes de verlo.
-## Que hace
+## Qué hace
-Con la retirada de las estadísticas de dislikes de la API de YouTube, nuestro *backend* pasó a usar una combinación de las estadísticas de dislikes archivadas y datos extrapolados de los usuarios de la extensión.
+Tras la retirada de las estadísticas de *dislikes* de la API de YouTube, nuestro *backend* pasó a usar una combinación de las estadísticas archivadas de *dislikes* y datos extrapolados de los usuarios de la extensión.
[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
## Por qué importa
-Puedes aprender más en nuestro sitio web en: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
+Para más información, visita nuestro sitio web: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
## Documentación de la API
-El uso de terceros de esta API abierta se permite bajo las siguientes restricciones:
+Se permite el uso de terceros de esta API abierta bajo las siguientes restricciones:
-- **Atribución**: Este proyecto debe estar claramente atribuido con un link a [returnyoutubedislike.com](https://returnyoutubedislike.com/).
-- **Límites de velocidad**: Hay límites de velocidad por cliente de 100 por minuto y 10.000 por día. Excederlos retornará un código de estado *409* indicando que tu aplicación debe bajar la velocidad.
+- **Atribución**: Este proyecto debe estar claramente atribuido con un enlace a [returnyoutubedislike.com](https://returnyoutubedislike.com/).
+- **Límites de velocidad**: Hay límites de velocidad por cliente de 100 solicitudes por minuto y 10.000 al día. Al excederlos se mostrará un código de estado *429*, indicando que tu aplicación debe bajar la velocidad.
-La API es accesible sobre la siguiente URL base:
+La API es accesible a través de la siguiente URL base:
https://returnyoutubedislikeapi.com
La lista de los *endpoints* disponibles se puede consultar aquí:
https://returnyoutubedislikeapi.com/swagger/index.html
-### Obtener votos
+### Obtención de votos
Ejemplo para obtener los votos del ID de un vídeo de YouTube proporcionado:
`/votes?videoId=kxOuG8jMIgI`
@@ -67,25 +65,25 @@ Ejemplo para obtener los votos del ID de un vídeo de YouTube proporcionado:
```
-Un ID de YouTube no existente retornará el codigo de estado *404* "Not Found" (no encontrado).
-Un ID de YouTube mal estructurado retornará *400* "Bad Request" (solicitud incorrecta).
+Un ID de YouTube no existente mostrará el código de estado *404* "Not Found" (no encontrado).
+Un ID de YouTube mal estructurado mostrará el código *400* "Bad Request" (solicitud incorrecta).
<!---
-## API documentation
+## Documentación de la API
-You can view all documentation on our website.
+Puedes ver toda la documentación en nuestra página web.
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
## Contribuciones
-Por favor, lee la [guía de contribución](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
+Rogamos que leas la [guía de contribución](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md) antes de empezar.
## ¡Apoya este proyecto!
-Puedes apoyar este proyecto donándonos en el enlace inferior:
+Puedes apoyar este proyecto enviando un donativo a través del enlace inferior:
[Donar](https://returnyoutubedislike.com/donate)
@@ -96,4 +94,4 @@ Puedes apoyar este proyecto donándonos en el enlace inferior:
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
-[Hazte nuestro patrocionador](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
+[Patrocínanos](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
diff --git a/READMEfr.md b/READMEfr.md
new file mode 100644
index 0000000..fc551cc
--- /dev/null
+++ b/READMEfr.md
@@ -0,0 +1,96 @@
+[![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)](LICENSE)
+
+# Return YouTube Dislike
+
+Lisez ceci dans d'autres langues : [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Türkçe](READMEtr.md)
+
+<p align="center">
+ <b>Return YouTube Dislike est une extension open-source qui ré-affiche les dislikes (pouces rouges) sur YouTube.</b><br>
+ Disponible pour Chrome et Firefox en tant qu'extension Web.<br>
+ Également disponible pour d'autres navigateurs en tant que JS Userscript.<br><br>
+ <img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
+</p>
+
+## Le récit des événements
+
+Le 10 novembre 2021, Google [a annoncé](https://blog.youtube/news-and-events/update-to-youtube/) que le compteur de dislike sur YouTube serait supprimé.
+
+En outre, le champ `dislike` de l'API YouTube a été [supprimé](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) le 13 décembre 2021, supprimant ainsi toute possibilité de juger de la qualité du contenu d'une vidéo avant de la regarder.
+
+## Ce qu'il fait
+
+Avec la suppression des statistiques du nombre de dislike de l'API YouTube, notre backend est passé à l'utilisation d'une combinaison de statistiques du nombre de dislike scrapé et d'estimations extrapolées à partir des données d'extension des utilisateurs.
+
+[FAQ](Docs/FAQfr.md)
+
+## Pourquoi c'est important
+
+Vous pouvez en savoir plus sur notre site web à l'adresse suivante : [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
+
+## Documentation de l'API
+
+L'utilisation par des tiers de cette API ouverte est autorisée avec les restrictions suivantes :
+
+- **Attribution**: Ce projet doit être clairement nommé avec un lien vers [returnyoutubedislike.com](https://returnyoutubedislike.com/).
+- **Limitation des requêtes**: Il y a des limites de requêtes par client en place qui sont de 100 requêtes par minute et 10 000 par jour. Nous renverrons un code d'erreur *429* indiquant que votre application devrait se calmer.
+
+L'API est accessible via l'URL de base suivante:
+https://returnyoutubedislikeapi.com
+
+La liste des endpoints est disponible ici:
+https://returnyoutubedislikeapi.com/swagger/index.html
+
+### Obtenir les likes
+Exemple pour obtenir les likes d'une vidéo YouTube avec un ID donné:
+`/votes?videoId=kxOuG8jMIgI`
+
+```json
+{
+ "id": "kxOuG8jMIgI",
+ "dateCreated": "2021-12-20T12:25:54.418014Z",
+ "likes": 27326,
+ "dislikes": 498153,
+ "rating": 1.212014408444885,
+ "viewCount": 3149885,
+ "deleted": false
+}
+```
+
+
+Si aucunne vidéo YouTube à cet ID, il sera retourner le code d'erreur *404* "Not Found".
+Un ID YouTube invilide renverra *400* "Bad Request".
+
+
+
+<!---
+## Documentation de l'API
+
+Vous pouvez consulter toute la documentation sur notre site web.
+[https://returnyoutubedislike.com/docs](https://returnyoutubedislike.com/docs) -->
+
+
+## Contribution
+
+Veuillez lire le [guide des contributions](CONTRIBUTINGfr.md).
+
+## Soutenez ce projet !
+
+Vous pouvez soutenir ce projet en faisant un don grâce au lien ci-dessous :
+
+[Donner](https://returnyoutubedislike.com/donate)
+
+## Sponsors
+[Piepacker](https://piepacker.com)
+
+[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
+
+[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
+
+[Devenez notre sponsor](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
diff --git a/READMEja.md b/READMEja.md
new file mode 100644
index 0000000..f10b0fa
--- /dev/null
+++ b/READMEja.md
@@ -0,0 +1,99 @@
+[![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)
+
+別の言語: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Türkçe](READMEtr.md)
+
+# Return YouTube Dislike
+
+<p align="center">
+ <b>Return YouTube DislikeはYouTubeの低評価を表示するためのオープンソースな拡張機能です。</b><br>
+ ChromeとFireFoxで拡張機能を利用可能です。<br>
+ また、他のブラウザでもJS Userscriptを利用できます。<br><br>
+ <img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
+</p>
+
+## これまでの経緯
+
+2021年10月10日、GoogleはYouTubeの低評価を非表示にすると[発表しました](https://blog.youtube/news-and-events/update-to-youtube/)。
+
+そして2021年12月13日、YouTube APIからも低評価が[削除]((https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts))され、動画のクオリティを判断する手段がなくなってしまいました。
+
+## What it Does
+
+<!-- この部分の翻訳が微妙? -->
+
+YouTube APIから低評価が削除されたことにより、バックエンドは拡張機能のユーザーをもとにスクレイピングされたデータと組み合わせて表示するように切り替わりました
+
+[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
+
+## 低評価が重要な理由
+
+ウェブサイトに詳細が書かれています: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
+
+## API ドキュメント
+
+サードパーティは以下の制限のもとでAPIを利用できます:
+
+- **帰属**: [returnyoutubedislike.com](https://returnyoutubedislike.com/) へのリンクを明確に表記してください。
+- **レート制限**: クライアントごとに1分あたり100回、1日あたり10000回という制限があります。制限に達すると*429*コードが返されます。
+
+APIは以下のBase URLでアクセスできます:
+https://returnyoutubedislikeapi.com
+
+利用可能なエンドポイントはこちらを参照してください:
+https://returnyoutubedislikeapi.com/swagger/index.html
+
+### 評価を取得
+APIを利用してYouTube video 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"が返されます。
+
+
+
+<!---
+## API ドキュメント
+
+APIの完全なドキュメントは公式サイトを参照してください。
+[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
+
+
+## 貢献する
+
+こちらの[contribution guide](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.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)
+
+[Become our sponsor](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
+
diff --git a/READMEru.md b/READMEru.md
index 3cc9abf..cdd2948 100644
--- a/READMEru.md
+++ b/READMEru.md
@@ -8,9 +8,11 @@
[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
+Прочитать на других языках: [English](README.md), [Español](READMEes.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md)
+
+
# Return YouTube Dislike
-Прочитать на других языках: [English](README.md), [Español](READMEes.md)
<p align="center">
<b>Return YouTube Dislike - это расширение с открытым исходным кодом, которое возвращает счётчик отметок «Не нравится» на YouTube.</b><br>
Доступно для Chrome и Firefox в качестве веб-расширения.<br>
@@ -22,13 +24,13 @@
10 ноября 2021 года Google [объявили](https://blog.youtube/news-and-events/update-to-youtube/), что счётчик «Не нравится» на YouTube будет удален.
-Кроме того, поле отметок `«Не нравится»` в API YouTube было [удалено]](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 декабря 2021 года, удалив любую возможность судить о качестве контента перед просмотром.
+Кроме того, поле отметок `dislike` в API YouTube было [удалено]](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/FAQ.md)
+[ЧаВО](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQru.md)
## Почему это важно
@@ -38,8 +40,8 @@
Стороннее использование этого открытого API разрешено со следующими ограничениями:
-- **Атрибуция**: Этот проект должен быть четко атрибутирован со ссылкой на [returnyoutubedislike.com](https://returnyoutubedislike.com/).
-- **Ограничение**: Существуют ограничения скорости для каждого клиента вместо 100 в минуту и 10 000 в день. Это выдаст код ошибки *429*, указывающий на то, что ваше приложение должно быть отключено.
+- **Атрибуция**: Этот проект должен быть чётко описан со ссылкой на [returnyoutubedislike.com](https://returnyoutubedislike.com/).
+- **Ограничение**: Существуют ограничения скорости для каждого клиента - 100 в минуту и 10 000 в день. Это выдаст код ошибки *429*, указывающий на то, что ваше приложение должно быть отключено.
API доступен по следующему основному URL-адресу:
https://returnyoutubedislikeapi.com
@@ -64,8 +66,8 @@ https://returnyoutubedislikeapi.com/swagger/index.html
```
-Ни один существующий идентификатор YouTube не выдаст код ошибки *404* "Не найдено".
-Неправильно сформированный идентификатор YouTube выдаст *400* "Неверный запрос".
+Неверный идентификатор YouTube выдаст код ошибки *404* "Не найдено".
+Неправильно отформатированный идентификатор YouTube выдаст код ошибки *400* "Неверный запрос".
@@ -78,7 +80,7 @@ https://returnyoutubedislikeapi.com/swagger/index.html
## Участие/помощь в разработке
-Пожалуйста, ознакомьтесь с [руководством по внесению вклада в проект (англ.)](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
+Пожалуйста, ознакомьтесь с [руководством по внесению вклада в проект](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGru.md).
## Поддержите этот проект!
diff --git a/READMEtr.md b/READMEtr.md
index 014c3f6..9a1f7ba 100644
--- a/READMEtr.md
+++ b/READMEtr.md
@@ -7,7 +7,7 @@
[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
[![Lisans](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
-Bunu diğer dillerde okuyun: [İngilizce](README.md), [İspanyolca](READMEes.md)
+Bunu diğer dillerde okuyun: [English](README.md), [Español](READMEes.md), [Français](READMEfr.md), [русский](READMEru.md), [日本語](READMEja.md)
# YouTube Dislike Sayısını Geri Getir
@@ -93,4 +93,4 @@ Aşağıdaki bağlantıdan bize bağış yapabilir ve bu projeye destek olabilir
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
-[Sponsorumuz olun](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601) \ No newline at end of file
+[Sponsorumuz olun](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
diff --git a/Website/_locales/en.ts b/Website/_locales/en.ts
index bbe39db..24af1f5 100644
--- a/Website/_locales/en.ts
+++ b/Website/_locales/en.ts
@@ -27,7 +27,7 @@ export default {
subtitle: 'Third party use of this open API is allowed with the following restrictions:',
bullet1: 'Attribution: ',
bullet1text: 'This project should be clearly attributed with either a link to this repo or a link to returnyoutubedislike.com',
- bullet2: 'Rate Limiting',
+ bullet2: 'Rate Limiting: ',
bullet2text: 'There are per client rate limits in place of 100 per minute and 10,000 per day. This will return a 429 status code indicating that your application should back off',
},
url: {
@@ -77,7 +77,7 @@ export default {
bullet2: 'Why isn\'t the dislike count updating?',
bullet2text: 'Right now video dislikes are cached and they aren\'t updated very frequently. It varies depending on a video\'s popularity but can take anywhere between a few hours and a few days to update.',
bullet3: 'How does this work?',
- bullet3text: 'The extension collects the video ID of the video you are watching, fetches the dislike (and other fields like views, likes etc) using our API. The extension then displays the dislike count and ratio on the page. If you like or dislike a video, that is recorded and sent to the database so an accurate dislike count can be extrapolated.',
+ bullet3text: 'The extension collects the video ID of the video you are watching, and fetches the dislike (and other fields like views, likes etc) using our API. The extension then displays the dislike count and ratio on the page. If you like or dislike a video, that is recorded and sent to the database so an accurate dislike count can be extrapolated.',
bullet4: 'Can I share my dislike count with you?',
bullet4text: 'Coming soon. We are looking into using Oauth or a different read only API with a limited scope so creators can share their dislike counts verifiability.',
bullet5: 'What data do you collect and how is it treated?',
diff --git a/Website/_locales/es.ts b/Website/_locales/es.ts
index 8123781..d881edb 100644
--- a/Website/_locales/es.ts
+++ b/Website/_locales/es.ts
@@ -4,39 +4,39 @@ export default {
...es,
home: {
name: 'Inicio',
- title: 'Regresar los Dislikes de YouTube',
- subtitle: 'Una extensión de navegador y una API que te muestra los dislikes en YouTube',
+ title: 'Return YouTube Dislike',
+ subtitle: 'Una extensión de navegador y una API que muestra el número de «dislikes» («No me gusta») en YouTube',
ukraine: 'Apoya a Ucrania',
sponsors: 'Patrocinadores',
},
install: {
- name: 'Instalar',
+ name: 'Instalación',
title: 'Elige tu plataforma',
subtitle: 'Disponible para Firefox y todos los navegadores Chromium',
title2: 'Otras plataformas',
subtitle2: 'Si tu navegador aún no es compatible, usa este UserScript',
title3: 'Implementaciones de terceros',
- subtitle3: 'No nos hacemos responsables, úsalas bajo tu propio riesgo',
+ subtitle3: 'No nos hacemos responsables, úsalas bajo tu cuenta y riesgo',
},
api: {
name: 'API',
- title: '¡Bienvenido a la documentación oficial de RYD!',
+ title: '¡Te damos la bienvenida a la documentación oficial de RYD!',
subtitle: 'Para empezar, elige una sección del menú.',
rights: {
title: 'Derechos de uso',
- subtitle: 'El uso de terceros de esta API abierta se permite bajo las siguientes restricciones: ',
+ subtitle: 'Se permite el uso de terceros de esta API abierta bajo las siguientes restricciones: ',
bullet1: 'Atribución: ',
- bullet1text: 'El proyecto debe estar claramente atribuido con un link a esta página o a returnyoutubedislike.com',
- bullet2: 'Límites de velocidad',
- bullet2text: 'Hay límites de velocidad por cliente de 100 por minuto y 10.000 por día. Esto regresará un código de estado 409 indicando que tu aplicación debe bajar la velocidad.',
+ bullet1text: 'El proyecto debe estar claramente atribuido con un enlace a este repositorio o a returnyoutubedislike.com',
+ bullet2: 'Límites de velocidad: ',
+ bullet2text: 'Hay límites de velocidad por cliente de 100 solicitudes por minuto y 10.000 al día. Al excederlos se mostrará un código de estado *429*, indicando que tu aplicación debe bajar la velocidad.',
},
url: {
title: 'Información de URL',
- subtitle: 'Esta API es accesible sobre la siguiente URL base: ',
+ subtitle: 'Esta API es accesible a través de la siguiente URL base: ',
},
endpoints: {
- title: 'Endpoints disponibles',
- subtitle: 'La lista de los endpoints disponibles está disponible aquí: ',
+ title: '«Endpoints» disponibles',
+ subtitle: 'La lista de los endpoints disponibles se puede consultar aquí: ',
},
fetching: {
title: 'Tutorial de consulta básica',
@@ -46,56 +46,59 @@ export default {
method: 'Método de la consulta: ',
headers: 'Encabezados: ',
response: 'Respuesta: ',
- error1: 'Un ID de YouTube inválido responderá con el código de estado 404 "Not Found"',
- error2: 'Un ID de YouTube con mal formato responderá con 400 "Bad Request"'
+ error1: 'Un ID de YouTube no existente mostrará el código de estado 404 "Not Found" (no encontrado).',
+ error2: 'Un ID de YouTube mal estructurado mostrará el código 400 "Bad Request" (solicitud incorrecta).'
},
},
help: {
name: 'Ayuda',
title: 'Solución de problemas',
- bullet1: 'Asegúrate de que tienes la última versión de la extensión instalada, ',
- bullet11: 'ahora mismo',
+ bullet1: 'Asegúrate de que tienes instalada la última versión de la extensión, ',
+ bullet11: '',
bullet2: 'Prueba a eliminar la extensión e instalarla de nuevo, después reinicia el navegador (todas las ventanas activas, no solo una pestaña)',
- bullet3: 'Asegúrate de qué este link se abre: ',
+ bullet3: 'Comprueba que puedes abrir este enlace: ',
bullet31: 'deberías ver este texto: ',
- bullet4: 'Si nada de esto funciona, reporta tú problema en',
- bullet41: 'en nuestro',
- bullet4a: 'Dínos tu sistema operativo, nombre del navegador y versión del navegador',
- bullet4b: 'Toma una captura de pantalla de la página con el problema (cómo una página de un vídeo de YouTube) con la consola abierta (pulsa ',
- bullet4b1: ') - captura de pantalla de ejemplo abajo.',
- bullet4c: 'Toma una captura de la página de extensiones de tu navegador con la extensión instalada.',
- bullet4c1: 'Para ver las extensiones pon esto en la barra de dirección: ',
+ bullet4: 'Si nada de esto surte efecto, informa de tu problema (en inglés) en el canal',
+ bullet41: 'de nuestro',
+ bullet4a: 'Dinos cuáles son tu sistema operativo, el nombre y la versión de tu navegador',
+ bullet4b: 'Haz una captura de pantalla de la página que contenga el problema (como una página de un vídeo de YouTube) con la consola abierta (pulsa ',
+ bullet4b1: '). Aquí puedes ver una captura de pantalla de ejemplo:',
+ bullet4c: 'Haz una captura de la página de extensiones de tu navegador con la extensión instalada.',
+ bullet4c1: 'Para ver las extensiones, escribe el siguiente texto en la barra de dirección: ',
firefox: 'para Firefox',
chrome: 'para Chrome, Edge, Brave, Opera, Vivaldi',
},
faq: {
- name: 'FAQ',
- title: 'Preguntas frecuentes',
- subtitle: '¿Sígues teniendo problemas? ¡Sientete libre de unirte a nuestro Discord (en inglés)!',
- bullet1: '¿De dónde saca sus datos la extensión?',
- bullet1text: 'Una combinación de datos archivados antes de que la API oficial de dislikes de YouTube se apagará, y datos estimados basados en los usuarios.',
- bullet2: '¿Por qué no se actualiza el contador de dislikes?',
- bullet2text: 'Ahora mismo los dislikes son guardados y no se actualizan muy frecuentemente. Varia dependiendo de la popularidad de un vídeo pero puede tardar entre unas pocas horas y unos pocos días en actualizarse.',
- bullet3: '¿Cómo funciona esto?',
- bullet3text: 'La extensión recoge el ID del vídeo qué estas viendo, carga los dislikes (y otros campos cómo las visitas, likes, etc) usando nuestra API. Entonces, la extensión muestra los dislikes y el radio en la página. Si le das like o dislike a un vídeo, eso se guarda y se envía a la base de datos para qué un contador de dislikes más acertado pueda ser creado.',
- bullet4: '¿Puedo compartir mi contador de dislikes con vosotros?',
- bullet4text: 'Próximamente. Estamos investigando en usar Oauth o una API diferente de solo lectura con alcance limitado para que los creadores puedan compartir sus contadores de dislikes verificablemente.',
- bullet5: '¿Qué datos guardais y cómo son guardados?',
- bullet5text: 'La extensión solo guarda datos que son estrictamente necesarios para que funcione correctamente, cómo la dirección IP o el ID del vídeo que estas viendo. Tus datos nunca serán vendidos a terceros. Si te gustaría saber más sobre cómo tratamos la seguridad y la privacidad mira nuestra <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">security FAQ</a>.',
- bullet6: '¿Cómo funciona la API/Backend?',
- bullet6text: 'El backend usa datos archivados de cuando la API de YouTube seguía proporcionando el contador de dislikes, los votos de usuarios de la extensión y extrapolación. En un futuro cercano permitíremos a los creadores de contenido proporcionar su contador de dislikes de forma fácil y segura y añadíremos datos archivados de ArchiveTeam (4,56 billones de vídeos) en nuestra base de datos. También puedes ver un vídeo al respecto.',
- bullet7: '¿Porque el contador de dislikes dice "DISLIKES DISABLED"?',
- bullet7text: 'A veces, un vídeo subido recientemente puede mostrar "DISLIKES DISABLED" incluso si el creador no lo ha desactivado, esto se debe a la forma en que detectamos si los "dislikes" están desactivados, debería desaparecer en unas horas o al darle like o dislike al vídeo y actualizar la página (con suerte).',
+ name: 'Preguntas',
+ title: 'Preguntas más frecuentes',
+ subtitle: '¿Sigues teniendo problemas? ¡Pásate por nuestro servidor de Discord (en inglés)!',
+ bullet1: '¿De dónde obtiene sus datos la extensión?',
+ bullet1text: 'De una combinación de datos archivados antes de que la API oficial de «dislikes» de YouTube se apagase, extrapolada con las acciones realizadas por los usuarios de la extensión.',
+ bullet2: '¿Por qué no se actualiza el contador de «dislikes»?',
+ bullet2text: 'En la actualidad, las cuentas de «dislikes» se almacenan en una caché y no se actualizan con frecuencia. Esta frecuencia varía dependiendo de la popularidad de un vídeo, pero puede tardar entre unas pocas horas y unos pocos días en actualizarse.',
+ bullet3: '¿Cómo funciona la extensión?',
+ bullet3text: 'La extensión lee el ID del vídeo que estés viendo y carga la cifra de «dislikes» (y otras estadísticas, como visitas, «likes», etc.) a través de nuestra API. Después la extensión muestra el número de «dislikes» y la proporción de «likes»/«dislikes» en la página. Si utilizas los botones de «Me gusta» o «No me gusta» de un vídeo, esa información se guardará y enviará a la base de datos con la que se podrá extrapolar una cuenta de «dislikes» más precisa.',
+ bullet4: '¿Puedo compartir mi contador de «dislikes» con vosotros?',
+ bullet4text: 'Próximamente. Estamos investigando en usar Oauth u otra API de solo lectura con alcance limitado para que los creadores puedan compartir sus contadores de «dislikes» verificablemente.',
+ bullet5: '¿Qué datos almacenáis y cómo son guardados?',
+ bullet5text: 'La extensión almacena únicamente aquellos datos estrictamente necesarios para su buen funcionamiento, cómo la dirección IP o el ID del vídeo que estés viendo. Tus datos nunca serán vendidos a terceros. Si quieres saber más sobre nuestras políticas de seguridad y privacidad, consulta nuestro <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">documento de preguntas frecuentes sobre seguridad</a>.',
+ bullet6: '¿Cómo funciona la API y el «backend»?',
+ bullet6text: 'El «backend» utiliza datos archivados de cuando la API de YouTube seguía proporcionando el contador de «dislikes», los votos de usuarios de la extensión y su extrapolación. En un futuro cercano permitiremos que los creadores de contenido puedan proporcionar sus cifras de «dislikes» de forma fácil y segura, e incorporaremos los datos archivados de ArchiveTeam (4.560 millones de vídeos) en nuestra base de datos. También puedes ver un vídeo al respecto.',
+ bullet7: '¿Porque el contador de «dislikes» dice «DISLIKES DESACTIVADOS»?',
+ bullet7text: 'En ocasiones, un vídeo subido recientemente puede mostrar «DISLIKES DESACTIVADOS» aunque su creador no los haya desactivado, esto se debe a la forma en que detectamos si los «dislikes» están desactivados. El mensaje debería desaparecer en unas horas o al darle «like» o «dislike» al vídeo y actualizar la página (con suerte).',
},
donate: {
name: 'Donar',
- subtitle: '¡Puedes apoyar nuestros esfuerzos de mantener el internet libre con una donación!',
+ subtitle: '¡Puedes apoyar nuestros esfuerzos para que Internet siga siendo con un donativo!',
},
links: {
name: 'Enlaces',
- title: 'Links del proyecto',
- subtitle: 'Links al proyecto y sus desarrolladores',
- contact: 'Contactame',
+ title: 'Enlaces del proyecto',
+ subtitle: 'Enlaces del proyecto y sus desarrolladores',
+ contact: 'Contacto',
translators: 'Traductores',
+ coolProjects: 'Proyectos interesantes',
+ sponsorBlockDescription: 'Omite los anuncios integrados en vídeos',
+ filmotDescription: 'Busca vídeos de YouTube a través de sus subtítulos'
},
} \ No newline at end of file
diff --git a/Website/_locales/fr.ts b/Website/_locales/fr.ts
new file mode 100644
index 0000000..51e550b
--- /dev/null
+++ b/Website/_locales/fr.ts
@@ -0,0 +1,104 @@
+import { fr } from 'vuetify/src/locale'
+
+export default {
+ ...fr,
+ home: {
+ name: 'Accueil',
+ title: 'Return YouTube Dislike',
+ subtitle: 'Une extension de navigateur et une API qui vous montre les dislike sur Youtube',
+ ukraine: 'Soutenir l\'Ukraine',
+ sponsors: 'Sponsors',
+ },
+ install: {
+ name: 'Installer',
+ title: 'Choisissez votre Plateforme',
+ subtitle: 'Disponible pour Firefox et tous les navigateurs Chromium',
+ title2: 'Autres platesformes',
+ subtitle2: 'Si votre navigateur n\'est pas encore pris en charge, essayez ce UserScript',
+ title3: 'Implémentations par des tiers',
+ subtitle3: 'Aucune responsabilité de notre part, à utiliser à vos risques et périls.',
+ },
+ api: {
+ name: 'API',
+ title: 'Bienvenue sur la documentation officiel de RYD !',
+ subtitle: 'Pour commencer, sélectionnez une section dans le menu.',
+ rights: {
+ title: 'Droits d\'utilisation',
+ subtitle: 'L\'utilisation par des tiers de cette API ouverte est autorisée avec les restrictions suivantes : ',
+ bullet1: 'Attribution: ',
+ bullet1text: 'Ce projet doit être clairement nommé avec un lien vers soit vers GitHub soit vers returnyoutubedislike.com',
+ bullet2: 'Limites des requêtes',
+ bullet2text: 'Il y a des limites de requêtes par client en place qui sont de 100 requêtes par minute et 10 000 par jour. Nous renverrons un code d\'erreur 429 indiquant que votre application devrait se calmer.',
+ },
+ url: {
+ title: 'Information sur l\'URL',
+ subtitle: 'L\'API est accesible via l\'URL de base suivante : ',
+ },
+ endpoints: {
+ title: 'Endpoints disponibles',
+ subtitle: 'La liste des endpoints disponibles est accesible ici : ',
+ },
+ fetching: {
+ title: 'Tutoriel de base sur la récupération des données',
+ subtitle: 'Exemple pour obtenir les likes d\'une vidéo YouTube avec un ID donné : ',
+ title2: 'Example de requête : ',
+ url: 'URL de la requête : ',
+ method: 'Mode de requête : ',
+ headers: 'En-têtes (headers) : ',
+ response: 'Réponse : ',
+ error1: 'Si aucunne vidéo YouTube à cet ID, il sera retourner le code d\'erreur 404 "Not Found"',
+ error2: 'Un ID YouTube invilide renverra *400* "Bad Request"'
+ },
+ },
+ help: {
+ name: 'Aide',
+ title: 'Dépannage',
+ bullet1: 'Assurez-vous que la dernière version de l\'extension est installée, ',
+ bullet11: 'à l\'heure actuelle',
+ bullet2: 'Essayez de supprimer l\'extension et de la réinstaller, puis redémarrez le navigateur (toutes les fenêtres actives, pas seulement un onglet).',
+ bullet3: 'Assurez-vous que ce lien s\'ouvre : ',
+ bullet31: 'vous devriez voir du texte brut : ',
+ bullet4: 'Si rien de ce qui précède ne vous aide, signalez votre problème sur',
+ bullet41: 'ou sur notre',
+ bullet4a: 'Indiquez-nous votre système d\'exploitation ansi que le nom et la version de votre navigateur',
+ bullet4b: 'Faites une capture d\'écran de la page présentant le problème (par exemple, la page de la vidéo youtube) avec la console ouverte (appuyez sur ',
+ bullet4b1: ') - exemple de capture d\'écran ci-dessous.',
+ bullet4c: 'Faites une capture d\'écran de la page des extensions de votre navigateur avec les extension installée.',
+ bullet4c1: 'Pour voir les extensions, mettez ceci dans la barre d\'adresse : ',
+ firefox: 'pour Firefox',
+ chrome: 'pour Chromium (Chrome, Edge, Brave, Opera, Vivaldi...)',
+ },
+ faq: {
+ name: 'FAQ',
+ title: 'Foire Aux Questions',
+ subtitle: 'Vous avez encore des questions ? N\'hésitez pas à rejoindre notre Discord (en anglais) !',
+ bullet1: 'Où l\'extension obtient-elle ses données ?',
+ bullet1text: 'Une combinaison de données archivées datant d\'avant la fermeture de l\'API officielle de YouTube pour les dislikes, et d\'extrapolation du comportement des utilisateurs.',
+ bullet2: 'Pourquoi le nombre de dislike n\'est-il pas mis à jour ?',
+ bullet2text: 'Actuellement, les dislike des vidéos sont mis en cache et ne sont pas mis à jour très fréquemment. La mise à jour varie en fonction de la popularité de la vidéo, mais peut prendre entre quelques heures et quelques jours.',
+ bullet3: 'Comment cela fonctionne-t-il ?',
+ bullet3text: 'L\'extension collecte l\'ID de la vidéo que vous regardez, récupère les dislike (et d\'autres champs comme les vues, les likes, etc.) en utilisant notre API. L\'extension affiche ensuite le nombre de dislike et le ratio sur la page. Si vous liker ou disliker une vidéo, cela est enregistré et envoyé à la base de données afin qu\'un nombre précis de dislikes puisse être extrapolé.',
+ bullet4: 'Puis-je partager mon compte de dislike avec vous ?',
+ bullet4text: 'Prochainement. Nous envisageons d\'utiliser Oauth ou une autre API en lecture seule avec un champ d\'application limité afin que les créateurs puissent partager leurs compteurs de dislikes de manière vérifiable.',
+ bullet5: 'Quelles sont les données que vous collectez et comment sont-elles traitées ?',
+ bullet5text: 'L\'extension ne collecte que les données strictement nécessaires à son bon fonctionnement, comme l\'adresse IP ou l\'ID de la vidéo que vous regardez. Aucune de vos données ne sera jamais vendue à des tiers. Si vous souhaitez en savoir plus sur la manière dont nous gérons la sécurité et la confidentialité, consultez notre <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQfr.md">FAQ sur la sécurité</a>.',
+ bullet6: 'Comment fonctionne l\'API / le Backend ?',
+ bullet6text: 'Le backend utilise des données archivées de l\'époque où l\'API Youtube renvoyait encore le nombre de dislike, il utilise aussi le nombre de like/dislike des utilisateurs de l\'extension et une extrapolation. Dans un avenir proche, nous allons permettre aux créateurs de contenu de soumettre leurs nombres de dislike facilement et en toute sécurité et nous allons ajouter les données archivées d\'ArchiveTeam (4,56 milliards de vidéos) à notre base de données actuelle. Vous pouvez également visionner une vidéo sur le sujet.',
+ bullet7: 'Pourquoi le compteur de dislike affiche-t-il "Désactivé par le créateur" ?',
+ bullet7text: 'Parfois, une vidéo récemment publiée peut afficher "Désactivé par le créateur" même si le créateur ne l\'a pas désactivé. Cela est dû à la façon dont nous détectons si les dislikes sont désactivés, cela devrait disparaître dans quelques heures ou en likant ou en dislikant la vidéo et en rafraîchissant la page (avec un peu de chance).',
+ },
+ donate: {
+ name: 'Donner',
+ subtitle: 'Vous pouvez soutenir nos efforts pour que l\'internet reste libre en faisant un don !',
+ },
+ links: {
+ name: 'Liens',
+ title: 'Liens du Projet',
+ subtitle: 'Liens vers le projet et ses développeurs',
+ contact: 'Contactez-moi',
+ translators: 'Traducteurs',
+ coolProjects: 'Projets Cool',
+ sponsorBlockDescription: 'Ignorer les publicités intégrées (sponso) dans la vidéo',
+ filmotDescription: 'Rechercher des vidéos YouTube par sous-titres'
+ },
+}
diff --git a/Website/_locales/ru.ts b/Website/_locales/ru.ts
index e4a0601..28b8fc0 100644
--- a/Website/_locales/ru.ts
+++ b/Website/_locales/ru.ts
@@ -4,8 +4,8 @@ export default {
...ru,
home: {
name: 'Главная',
- title: 'Вернуть YouTube Дизлайки',
- subtitle: 'Расширение для браузера и API, которые показывают вам дизлайки в Youtube',
+ title: 'Вернуть YouTube дизлайки',
+ subtitle: 'Расширение для браузера и API, которые показывают вам отметки «Не нравится» в Youtube',
ukraine: 'Поддержите Украину',
sponsors: 'Спонсоры',
},
@@ -14,7 +14,7 @@ export default {
title: 'Выберите свою платформу',
subtitle: 'Доступно в Firefox и во всех Chromium браузерах',
title2: 'Другие платформы',
- subtitle2: 'Если ваш браузер еще не поддерживается, попробуйте этот пользовательский скрипт',
+ subtitle2: 'Если ваш браузер ещё не поддерживается, попробуйте этот пользовательский скрипт',
title3: 'От других разработчиков',
subtitle3: 'Никакой ответственности с нашей стороны, используйте на свой страх и риск',
},
@@ -26,28 +26,28 @@ export default {
title: 'Права пользования',
subtitle: 'Использование этого открытого API третьими лицами разрешено со следующими ограничениями:',
bullet1: 'Aтрибуция: ',
- bullet1text: 'Этот проект должен быть четко описан либо ссылкой на этот репозиторий, либо ссылкой на returnyoutubedislike.com',
- bullet2: 'Ограничение Скорости',
- bullet2text: 'Существуют ограничения на скорость для каждого клиента - 100 в минуту и 10 000 в день. Это вернет код 429, указывающий на то, что ваше приложение превысило лимит',
+ bullet1text: 'Этот проект должен быть чётко описан либо ссылкой на этот репозиторий, либо ссылкой на returnyoutubedislike.com',
+ bullet2: 'Ограничение',
+ bullet2text: 'Существуют ограничения на скорость для каждого клиента - 100 в минуту и 10 000 в день. Это выдаст код ошибки 429, указывающее на то, что ваше приложение превысило лимит',
},
url: {
title: 'Информация о URL-адресе',
- subtitle: 'API доступен по следующему базовому URL-адресу: ',
+ subtitle: 'API доступен по следующему URL-адресу: ',
},
endpoints: {
- title: 'Доступные Конечные точки',
+ title: 'Доступные конечные точки (эндпоинты)',
subtitle: 'Список доступных конечных точек доступен здесь: ',
},
fetching: {
title: 'Базовое руководство по выборке',
- subtitle: 'Пример получения голосов на заданный видео ID на YouTube ',
+ subtitle: 'Пример получения голосов на заданный видео идентификатор на YouTube ',
title2: 'Пример запроса: ',
url: 'URL-адрес запроса: ',
method: 'Способ запроса: ',
- headers: 'Шапка: ',
+ headers: 'Заголовок: ',
response: 'Ответ: ',
- error1: 'Неверный YouTube ID вернет код состояния 404 "Не найден"',
- error2: 'Неправильно отформатированный YouTube ID вернет 400 "Неверный запрос"'
+ error1: 'Неверный идентификатор YouTube выдаст код ошибки 404 "Не найдено"',
+ error2: 'Неправильно отформатированный идентификатор YouTube выдаст код ошибки 400 "Неверный запрос"'
},
},
help: {
@@ -69,23 +69,23 @@ export default {
chrome: 'для Chrome, Edge, Brave, Opera, Vivaldi',
},
faq: {
- name: 'FAQ',
- title: 'Частые Вопросы',
- subtitle: 'Все еще есть вопросы? Не стесняйтесь заглянуть в наш Дискорд!',
+ name: 'ЧаВО',
+ title: 'Частые вопросы',
+ subtitle: 'Всё ещё есть вопросы? Не стесняйтесь заглянуть в наш Discord!',
bullet1: 'Откуда расширение получает данные?',
- bullet1text: 'Комбинация архивных данных, полученных до закрытия официального YouTube дизлайк API, и экстраполяция поведения пользователей расширения.',
- bullet2: 'Почему количество дизлайков не обновляется?',
- bullet2text: 'На данный момент видео дизлайки кэшируются, и обновляются не очень часто. Это зависит от популярности видео, но обновление может занять от нескольких часов до нескольких дней.',
+ bullet1text: 'Комбинация архивных данных, полученных до закрытия официального API YouTube с отметками «Не нравится», и экстраполяция поведения пользователей расширения.',
+ bullet2: 'Почему количество отметок «Не нравится» не обновляется?',
+ bullet2text: 'На данный момент видео отметки «Не нравится» кэшируются, и обновляются не очень часто. Это зависит от популярности видео, но обновление может занять от нескольких часов до нескольких дней.',
bullet3: 'Как это работает?',
- bullet3text: 'Расширение берет ID видео которое вы смотрите, извлекает количество дизлайков (и другие поля, такие как просмотры, лайки и т.д.) используя наш API. Затем расширение отображает количество дизлайков на странице. Если если вы лайкаете или дизлайкаете видео, это записывается и отправляется в базу данных, чтобы можно было экстраполировать точное количество дизлайков.',
- bullet4: 'Могу я поделиться с вами своим количеством дизлайков?',
- bullet4text: 'Скоро. Мы рассматриваем возможность использования Oauth или другого API, доступного только для чтения, с ограниченной областью действия, чтобы создатели могли делиться своим количеством дизлайков.',
+ bullet3text: 'Расширение берёт идентификатор видео которое вы смотрите, извлекает количество отметок «Не нравится» (и другие поля, такие как просмотры, отметки «Нравится» и т.д.) используя наш API. Затем расширение отображает количество отметок «Не нравится» на странице. Если если вы оставляете отметки «Нравится» или «Не нравится», это записывается и отправляется в базу данных, чтобы можно было экстраполировать точное количество отметок.',
+ bullet4: 'Могу я поделиться с вами своим количеством отметок «Не нравится»?',
+ bullet4text: 'Скоро. Мы рассматриваем возможность использования Oauth или другого API, доступного только для чтения, с ограниченной областью действия, чтобы создатели могли делиться своим количеством отметок «Не нравится».',
bullet5: 'Какие данные вы собираете и как они обрабатываются?',
- bullet5text: 'Расширение собирает только те данные, которые строго необходимы для его правильной работы, такие как IP-адрес или ID видео которое вы смотрите. Ваши данные никогда не будут проданы третьим лицам. Если вы хотите узнать больше о том, как мы обеспечиваем безопасность и конфиденциальность, ознакомьтесь с нашим <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">FAQ по безопасности</a>.',
+ bullet5text: 'Расширение собирает только те данные, которые строго необходимы для его правильной работы, такие как IP-адрес или идентификатор видео которое вы смотрите. Ваши данные никогда не будут проданы третьим лицам. Если вы хотите узнать больше о том, как мы обеспечиваем безопасность и конфиденциальность, ознакомьтесь с нашим <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQru.md">ЧаВО по безопасности</a>.',
bullet6: 'Как работает API/серверная часть?',
- bullet6text: 'Серверная часть использует архивные данные с тех пор, когда YouTube API все еще возвращал количество дизлайков, количество лайков/дизлайков пользователей расширения и экстраполяцию. В ближайшем будущем мы позволим создателям контента легко и безопасно отправлять количество своих дизлайков, и мы добавим архивные данные ArchiveTeam (4,56 миллиарда видео) в нашу текущую базу данных. Вы также можете просмотреть видео на эту тему.',
- bullet7: 'Почему дизлайки показывают \'DISLIKES DISABLED\'?',
- bullet7text: 'Иногда недавно загруженное видео может показывать "DISLIKES DISABLED", это связано с тем как мы определяем отключены ли дизлайки, должно исчезнуть через несколько часов или после лайка или дизлайка видео и обновления страницы (надеюсь).',
+ bullet6text: 'Серверная часть использует архивные данные с тех пор, когда YouTube API всё ещё выдавал количество отметок «Не нравится», количество отметок «Нравится» и «Не нравится» пользователей расширения и экстраполяцию. В ближайшем будущем мы позволим создателям контента легко и безопасно отправлять количество своих отметок «Не нравится», и мы добавим архивные данные ArchiveTeam (4,56 миллиарда видео) в нашу текущую базу данных. Вы также можете просмотреть видео на эту тему.',
+ bullet7: 'Почему счётчик отметок «Не нравится» показывает \'DISLIKES DISABLED\'?',
+ bullet7text: 'Иногда недавно загруженное видео может показывать "DISLIKES DISABLED", это связано с тем как мы определяем отключены ли отметки «Не нравится», и должно исчезнуть через несколько часов или после получения отметки «Нравится» или «Не нравится» и обновления страницы (надеюсь).',
},
donate: {
name: 'Пожертвовать',
@@ -97,7 +97,7 @@ export default {
subtitle: 'Ссылки на проект и его разработчиков',
contact: 'Связаться',
translators: 'Переводчики',
- sponsorBlockDescription: 'Проматывает рекламу встроенную в видео',
+ sponsorBlockDescription: 'Проматывает рекламу, встроенную в видео',
filmotDescription: 'Поиск по субтитрам YouTube'
},
}
diff --git a/Website/_locales/tr.ts b/Website/_locales/tr.ts
index a324ebb..f064e10 100644
--- a/Website/_locales/tr.ts
+++ b/Website/_locales/tr.ts
@@ -27,7 +27,7 @@ export default {
subtitle: 'Herkese açık API\'nin üçüncü parti kişilerin kullanımında aşağıdaki kısıtlamalara izin verir:',
bullet1: 'Atıf: ',
bullet1text: 'Bu proje, bu depoya ya da returnyoutubedislike.com sitesine bir bağlantı ile açıkça atfedilmelidir',
- bullet2: 'Hız Sınırlaması',
+ bullet2: 'Hız Sınırlaması: ',
bullet2text: 'Kullanıcı başına dakikada 100 ve günde 10.000 hız sınırlaması vardır. Bu, uygulamanızın geri çekilmesi gerektiğini belirten 429 durum kodunu döndürür',
},
url: {
@@ -39,7 +39,7 @@ export default {
subtitle: 'Kullanılabilir endpoint\'lerin listesi burada mevcuttur: ',
},
fetching: {
- title: 'Temel Fetching Eğitimi',
+ title: 'Temel Veri Alma Eğitimi',
subtitle: 'Belirli bir YouTube ID\'sinin oylamalarını elde etmek için bir örnek: ',
title2: 'Örnek İstek: ',
url: 'İstek URL\'si: ',
@@ -53,7 +53,7 @@ export default {
help: {
name: 'Yardım',
title: 'Sorun Giderme',
- bullet1: 'Uzantının en son sürümü olan ',
+ bullet1: 'Uzantının en son sürümü olan ',
bullet11: ' sürümünün kurulu olduğundan emin olun',
bullet2: 'Uzantıyı kaldırıp yeniden yüklemeyi deneyin, sonra tarayıcınızı yeniden başlatın (tüm aktif sekmeleri kapatın, sadece tek bir sekmeyi değil)',
bullet3: 'Şu bağlantıyı açtığınızdan emin olun: ',
@@ -70,7 +70,7 @@ export default {
},
faq: {
name: 'SSS',
- title: 'Sık Sorulan Sorular',
+ title: 'Sıkça Sorulan Sorular',
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.',
@@ -81,7 +81,7 @@ export default {
bullet4: 'Dislike sayımı sizinle paylaşabilir miyim?',
bullet4text: 'Çok yakında evet. İçerik üreticilerinin dislike sayıları için doğrulanabilirliğini paylaşabilmeleri amacıyla Oauth ya da sınırlı bir kapsamda farklı bir salt okunur API kullanmayı düşünüyoruz.',
bullet5: 'Hangi verileri topluyorsunuz ve bunlar nasıl işleniyor?',
- bullet5text: 'Uzantı, yalnızca izlediğiniz videonun IP adresi veya videonun ID\'si gibi düzgün çalışması için kesinlikle gerekli olan verileri toplar. Verileriniz asla 3. taraflara satılmayacaktır. Güvenliği ve gizliliği nasıl ele aldığımız hakkında daha fazla bilgi için <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">security FAQ(güvenlik SSS)</a> adresine gidin.',
+ bullet5text: 'Uzantı, yalnızca izlediğiniz videonun IP adresi veya videonun ID\'si gibi düzgün çalışması için kesinlikle gerekli olan verileri toplar. Verileriniz asla 3. taraflara satılmayacaktır. Güvenliği ve gizliliği nasıl ele aldığımız hakkında daha fazla bilgi için <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">security FAQ</a>\'ya gidin.',
bullet6: 'API/Yazılım(Backend) nasıl çalışıyor?',
bullet6text: 'Yazılım, YouTube API\'sinin dislike sayısını ve uzantı kullanıcılarının like/dislike sayısı sonuçların genişletilmesinin döndürmeye devam ettiği zamana ait arşivlenmiş verileri kullanır. Yakın zamanda içerik üreticilerin dislike sayısını kolay ve güvenli bir şekilde göndermelerine izin vereceğiz ve ArchiveTeam\'in arşivlenmiş verilerini (4,56 milyar video) veri tabanımıza ekleyeceğiz. Ayrıca konu ile ilgili videoyu da izleyebilirsiniz.',
bullet7: 'Dislike sayısı neden \'DISLIKES DISABLED\'(DISLIKE\'LAR AKTİF DEĞİL) olarak gözüküyor?',
@@ -96,6 +96,9 @@ export default {
title: 'Proje Bağlantıları',
subtitle: 'Projeye ve geliştiricilerine bağlantılar',
contact: 'Bana Ulaşın',
- translators: 'Yerelleştirmenler',
+ translators: 'Çevirmenler',
+ coolProjects: 'Hoş Projeler',
+ sponsorBlockDescription: 'Videolara gömülü reklamları pas geçer',
+ filmotDescription: 'YouTube videolarını alt yazılara göre aramanızı sağlar'
},
}
diff --git a/Website/layouts/default.vue b/Website/layouts/default.vue
index 1db2382..15c5f00 100644
--- a/Website/layouts/default.vue
+++ b/Website/layouts/default.vue
@@ -103,7 +103,7 @@ export default {
{ name: "Español", locale: "es" },
{ name: "Türkçe", locale: "tr" },
{ name: "Русский", locale: "ru" },
- // { name: "Français", locale: "fr" },
+ { name: "Français", locale: "fr" },
// { name: "Deutsch", locale: "de" },
// ...
],
diff --git a/Website/nuxt.config.js b/Website/nuxt.config.js
index 28d13de..ea38ffa 100644
--- a/Website/nuxt.config.js
+++ b/Website/nuxt.config.js
@@ -2,7 +2,7 @@ import en from "./_locales/en";
import es from "./_locales/es";
import tr from "./_locales/tr";
import ru from "./_locales/ru";
-// import fr from "./_locales/fr";
+import fr from "./_locales/fr";
// import de from "./_locales/de";
// ...
export default {
@@ -48,7 +48,7 @@ export default {
// Vuetify module configuration: https://go.nuxtjs.dev/config-vuetify
vuetify: {
lang: {
- locales: { en, es, tr, ru /*, fr, de, ...*/ },
+ locales: { en, es, tr, ru, fr /*, de, ...*/ },
current: "en",
},
theme: {
diff --git a/Website/pages/links.vue b/Website/pages/links.vue
index 3fbe465..a17fc23 100644
--- a/Website/pages/links.vue
+++ b/Website/pages/links.vue
@@ -99,6 +99,10 @@ export default {
tag: "PickleNik#0864",
lang: "Русский",
},
+ {
+ tag: "NiniKo",
+ lang: "Français",
+ },
],
coolProjects: [
{ name: "SponsorBlock", url: "https://sponsor.ajay.app/", description: "$vuetify.links.sponsorBlockDescription" },
diff --git a/extension-description-store-french.txt b/extension-description-store-french.txt
new file mode 100644
index 0000000..d4a45d5
--- /dev/null
+++ b/extension-description-store-french.txt
@@ -0,0 +1,20 @@
+Return YouTube Dislike rétablit la possibilité de voir les dislikes sur YouTube.
+
+Si cela ne fonctionne pas : ouvrez l'onglet des extensions (chrome://extensions/) désactivez cette extension et réactivez-la. Il s'agit d'un bug dans Chromium qui casse l'extension dans certains cas. Cela devrait résoudre la plupart des problèmes. Espérons que l'équipe de Chromium corrigera ce problème bientôt.
+
+Depuis le 13 décembre 2021, YouTube a supprimé la possibilité de voir les dislikes de son API.
+Cette extension vise à redonner le pouvoir aux utilisateurs en utilisant une combinaison de données archivées des likes et des dislikes, ainsi que les likes et les dislikes faits par les utilisateurs de l'extension pour montrer les évaluations les plus précises.
+
+Nous disposons à ce jour de plus de 200 millions de vidéos avec leurs données de likes et de dislikes datant d'avant le 13 décembre 2021.
+
+Croissance active et reste à jour avec les uploads datant d'après le 13 décembre 2021.
+
+Plus il y aura d'utilisateurs de l'extension, plus elle sera précise.
+
+Les vidéos impopulaires mises en ligne ultérieurement au 13 décembre 2021 peuvent présenter des données moins précises que les vidéos plus populaires.
+
+Cette extension est actuellement en développement actif, donc si vous rencontrez des problèmes, n'hésitez pas à les signaler sur notre page GitHub ou sur notre serveur Discord.
+
+D'autres fonctionnalités seront bientôt disponibles !
+
+https://github.com/Anarios/return-youtube-dislike
diff --git a/extension-description-store-spanish.txt b/extension-description-store-spanish.txt
new file mode 100644
index 0000000..e6904b7
--- /dev/null
+++ b/extension-description-store-spanish.txt
@@ -0,0 +1,20 @@
+Return YouTube Dislikes restaura la capacidad de ver los «dislikes» («No me gusta»), en YouTube.
+
+En caso de que no funcione: abre la pestaña de Extensiones (chrome://extensions/), desactiva esta extensión y luego vuelve a activarla. Existe un fallo en Chromium que, en algunos casos, da problemas con la extensión. Esta solución debería arreglar la mayoría de los problemas. Con suerte, el equipo de Chromium resolverá el problema pronto.
+
+A partir del 13 de diciembre de 2021, YouTube quitó la capacidad de ver la cantidad de «dislikes» desde su API.
+El fin de esta extensión es el de devolver poder a los usuarios mediante una combinación de datos archivados de cantidades de «likes» («Me gusta») y «dislikes» («No me gusta»), a los que se sumarán los «likes» y «dislikes» enviados por los usuarios de esta extensión, con el fin de mostrar valoraciones precisas.
+
+Actualmente tiene almacenada la información recuperada antes del 13 de diciembre de 2021 de los «likes»/«dislikes» de más de 200 millones de vídeos.
+
+La extensión está creciendo de forma activa y actualizándose con los vídeos subidos después del 13 de diciembre de 2021.
+
+Cuantas más personas utilicen la extensión, más precisa será.
+
+Los vídeos menos populares que se hayan subido después del 13 de diciembre de 2021 podrían mostrar datos menos precisos que los vídeos más populares.
+
+Esta extensión está siendo desarrollada de forma activa: si tienes cualquier problema, no dudes en comentarlo a través de nuestra página de GitHub o en nuestro servidor de Discord (en inglés, por favor).
+
+¡Próximamente incluiremos más características!
+
+https://github.com/Anarios/return-youtube-dislike
diff --git a/extension-description-store.txt b/extension-description-store.txt
index f02403e..198ad6c 100644
--- a/extension-description-store.txt
+++ b/extension-description-store.txt
@@ -1,6 +1,6 @@
Return YouTube Dislike restores the ability to see dislikes on YouTube.
-If it doesn't work: open extensions tab (chrome://extensions/) disable this extension and enable it again. This is a bug in chromium that breaks the extension in some cases. This should fix most of the problems. Hopefully the chromium team will fix this soon.
+If it doesn't work: open the Extensions tab (chrome://extensions/), disable this extension and enable it again. This should fix most of the problems, since there is a bug in Chromium that breaks the extension in some cases. Hopefully the Chromium team will fix this soon.
Starting December 13th 2021, YouTube removed the ability to see dislikes from their API.
This extension aims to restore power to users by using a combination of archived like and dislike data, as well as the likes and dislikes made by extension users to show the most accurate ratings.