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:20:26 +0300
committerGitHub <noreply@github.com>2022-07-20 01:20:26 +0300
commit0de62d9ff72e72309ddba999e50b8fb0f1429985 (patch)
tree771e727000568f7f8fad734786c4915a6978cabc
parent98861c18b1383a3de53c9eb550789f924f56c70e (diff)
parent1f0cfbb1dcff05e6828bee62f69a5de761ce233e (diff)
Merge branch 'develop' into patch-1
-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.json6
-rw-r--r--Extensions/combined/popup.css63
-rw-r--r--Extensions/combined/popup.html22
-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.md2
-rw-r--r--READMEes.md3
-rw-r--r--READMEfr.md96
-rw-r--r--READMEja.md99
-rw-r--r--READMEru.md18
-rw-r--r--READMEtr.md2
-rw-r--r--Website/_locales/fr.ts104
-rw-r--r--Website/_locales/ru.ts52
-rw-r--r--Website/_locales/tr.ts2
-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
38 files changed, 1217 insertions, 144 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 28c476c..ddb9cc7 100644
--- a/Extensions/combined/_locales/en/messages.json
+++ b/Extensions/combined/_locales/en/messages.json
@@ -30,16 +30,16 @@
"message": "Disable like/dislike submission"
},
"textLikesDisabled": {
- "message": "disabled by owner"
+ "message": "Disabled by Owner"
},
"textSettingsHover": {
"message": "Stops counting your likes and dislikes."
},
"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/popup.css b/Extensions/combined/popup.css
index c5e0d34..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;
}
diff --git a/Extensions/combined/popup.html b/Extensions/combined/popup.html
index 7d39246..a145686 100644
--- a/Extensions/combined/popup.html
+++ b/Extensions/combined/popup.html
@@ -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__"
@@ -108,7 +108,7 @@
<span class="switchLabel">Show rounded down numbers</span>
</label>
<br/>
- <label class="switch" data-hover="Make likes and dislikes format consistent">
+ <label class="switch" data-hover="Make likes and dislikes format consistent (does not work on Shorts)">
<input type="checkbox" id="number_reformat_likes"/>
<span class="slider"/>
<span class="switchLabel">Re-format like numbers</span>
@@ -137,7 +137,7 @@
</label>
<br/>
<div class="custom-select">
- <label for="color_theme">Color theme:</label>
+ <label for="color_theme" class="label-with-hover-tip" data-hover="">Color theme:</label>
<select name="color_theme" id="color_theme">
<option value="classic" id="color_theme_classic">Classic</option>
<option value="accessible" id="color_theme_accessible">
@@ -166,6 +166,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 3143e67..418d2bc 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
-Read this in other languages: [Español](READMEes.md), [русский](READMEru.md), [Türkçe](READMEtr.md)
+Read this in other languages: [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md)
# Return YouTube Dislike
diff --git a/READMEes.md b/READMEes.md
index 18a706a..abc3b89 100644
--- a/READMEes.md
+++ b/READMEes.md
@@ -7,7 +7,8 @@
[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
-Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Türkçe](READMEtr.md)
+
+Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Français](READMEfr.md) [日本語](READMEja.md), [Türkçe](READMEtr.md)
# Return YouTube Dislike
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 16dd25f..cdd2948 100644
--- a/READMEru.md
+++ b/READMEru.md
@@ -7,7 +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)
-Прочитать на других языках: [English](README.md), [Español](READMEes.md), [Türkçe](READMEtr.md)
+
+Прочитать на других языках: [English](README.md), [Español](READMEes.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md)
+
# Return YouTube Dislike
@@ -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 db27a37..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: [English](README.md), [Español](READMEes.md), [русский](READMEru.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
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 c5986c1..f064e10 100644
--- a/Website/_locales/tr.ts
+++ b/Website/_locales/tr.ts
@@ -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</a>'ya 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?',
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