mirror of
https://github.com/Anarios/return-youtube-dislike.git
synced 2026-09-12 10:22:10 +02:00
Merge remote-tracking branch 'origin/main' into pr/fernandodillandTranslation-of-CONTRIBUTING.md-into-native-Spanish
# Conflicts: # CONTRIBUTING.md # CONTRIBUTINGfr.md # CONTRIBUTINGnl.md # CONTRIBUTINGru.md # CONTRIBUTINGtr.md # CONTRIBUTINGuk.md
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
{
|
||||
"presets": ["@babel/preset-env"]
|
||||
"presets": ["@babel/preset-env"],
|
||||
"plugins": ["rewire"]
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ labels: ["bug"]
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Have you tried to find similar open issues?
|
||||
label: Have you tried to find similar issues (open or recently closed)?
|
||||
options:
|
||||
- label: "Yes, this issue is not a duplicate"
|
||||
required: true
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
name: Test Build Extension
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- Extensions/combined/**
|
||||
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths:
|
||||
- Extensions/combined/**
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./Extensions/combined
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Setup Node 20
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20.x'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Build extension
|
||||
run: npm run build
|
||||
|
||||
- name: 'Upload Chrome artifact'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ryd-chrome
|
||||
path: ./Extensions/combined/dist/chrome
|
||||
|
||||
- name: 'Upload Firefox artifact'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ryd-firefox
|
||||
path: ./Extensions/combined/dist/firefox
|
||||
|
||||
- name: 'Upload Safari artifact'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ryd-safari
|
||||
path: ./Extensions/combined/dist/safari
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
Read this in other languages: [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
Read this in other languages: [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
# Welcome To Return YouTube Dislikes contributing guide
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
Read this in other languages: [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
||||
|
||||
# Willkommen beim Leitfaden für Beitragende von Return YouTube Dislikes
|
||||
|
||||
Vielen Dank, dass du deine Zeit investierst, um zu unserem Projekt beizutragen! Alle deine Änderungen werden in der nächsten Version der Erweiterung (oder der [Website](https://www.returnyoutubedislike.com/)) reflektiert.
|
||||
|
||||
## Erste Schritte
|
||||
|
||||
Bitte verwende Prettier mit den Standardeinstellungen für die Formatierung.
|
||||
|
||||
#### Voraussetzungen
|
||||
|
||||
Du musst Node und npm installiert haben, um die gebündelte Version der Quelle zu erstellen.
|
||||
|
||||
Verwendete Versionen beim Einrichten:
|
||||
|
||||
- Node: 12.18.4
|
||||
- npm: 6.14.6
|
||||
|
||||
Um die `bundled-content-script.js` zu erstellen, die den Großteil der Geschäftslogik dieser Erweiterung enthält, musst du zuerst alle Abhängigkeiten installieren.
|
||||
|
||||
1. Gehe zum Root-Verzeichnis des Repos und führe aus:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Führe den folgenden Befehl aus, um `bundled-content-script.js` zu erstellen, das in `manifest.json` verwendet wird:
|
||||
|
||||
```
|
||||
npm start // um die Build-Datei(en) zu erstellen und einen Datei-Watcher zu starten, der bei jedem Speichern neu lädt
|
||||
|
||||
// oder
|
||||
|
||||
npm run build // um die Build-Datei(en) einmal zu erstellen
|
||||
```
|
||||
|
||||
Herzlichen Glückwunsch, du bist jetzt bereit zum Entwickeln!
|
||||
|
||||
Wenn du neu in der Entwicklung von Chrome-Erweiterungen bist oder zusätzliche Hilfe benötigst, sieh dir bitte [dieses YouTube-Tutorial](https://www.youtube.com/watch?v=mdOj6HYE3_0) an.
|
||||
|
||||
### Probleme
|
||||
|
||||
#### Öffnen eines neuen Problems
|
||||
|
||||
Wenn du Probleme mit der Erweiterung hast, suche bitte, um sicherzustellen, dass das Problem noch nicht gemeldet wurde. Wenn nicht, öffne ein Problem. Die Verwendung des Problemformulars wird dringend empfohlen, ist aber nicht zwingend erforderlich.
|
||||
|
||||
#### Lösung eines Problems
|
||||
|
||||
Wenn du ein Problem gefunden hast, das du lösen könntest, sei nicht schüchtern. Öffne einen PR mit der Lösung und vergewissere dich, dass du das behobene Problem erwähnst.
|
||||
|
||||
### Feature-Anfrage
|
||||
|
||||
#### Öffnen einer neuen Feature-Anfrage
|
||||
|
||||
Wenn du eine Idee für die Erweiterung hast, kannst du gerne eine Feature-Anfrage öffnen, aber suche bitte zuerst, um sicherzustellen, dass das Feature noch nicht vorgeschlagen wurde. Die Verwendung des Feature-Formulars wird dringend empfohlen, ist aber nicht zwingend erforderlich.
|
||||
|
||||
#### Implementierung einer Feature-Anfrage
|
||||
|
||||
Wenn du ein Feature gefunden hast, das du implementieren könntest, sei nicht schüchtern. Öffne einen PR mit der Implementierung und vergewissere dich, dass du das implementierte Feature erwähnst.
|
||||
|
||||
### Welche PRs akzeptieren wir?
|
||||
|
||||
- Fehlerbehebungen.
|
||||
- Implementierung von Funktionen.
|
||||
- Rechtschreibfehler oder bessere und einfachere Wörter zur Verwendung.
|
||||
- Beiträge zur Website.
|
||||
+1
-3
@@ -1,6 +1,4 @@
|
||||
|
||||
Lisez ceci dans d'autres langues : [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
Lisez ceci dans d'autres langues : [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), Nederlands](CONTRIBUTINGnl.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
# Bienvenue dans le guide de contribution à Return YouTube Dislikes
|
||||
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
Διαβάστε το παρόν σε άλλες γλώσσες: [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md)
|
||||
|
||||
|
||||
# Welcome To Return YouTube Dislikes contributing guide
|
||||
|
||||
Σας ευχαριστούμε που αφιερώσατε χρόνο για να συνεισφέρετε στο έργο μας! Όλες οι αλλαγές σας θα εμφανιστούν στην επόμενη έκδοση της επέκτασης (ή στην [ιστοσελίδα](https://www.returnyoutubedislike.com/)).
|
||||
|
||||
## Ξεκινώντας
|
||||
|
||||
Παρακαλώ χρησιμοποιήστε το Prettier με τις προκαθορισμένες ρυθμίσεις για τη μορφοποίηση.
|
||||
|
||||
#### Προαπαιτούμενα
|
||||
|
||||
Πρέπει να έχετε το node και το npm εγκαταστημένο για να δημιουργήσετε την ομαδοποιημένη έκδοση της πηγής.
|
||||
|
||||
Εκδόσεις για την εγκατάσταση:
|
||||
|
||||
- node: 12.18.4
|
||||
- npm: 6.14.6
|
||||
|
||||
Για να δημιουργήσετε το `bundled-content-script.js` που περιέχει το περισσότερο business logic αυτής της επέκτασης πρέπει να εγκαταστήσετε όλα τα dependencies πρώτα.
|
||||
|
||||
1. Πηγαίντε στη ρίζα (root) του repo και εκτελέστε:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Εκτελέστε την ακόλουθη εντολή για να δημιουργήσετε το `bundled-content-script.js` το οποίο χρησιμοποιείται στο `manifest.json`
|
||||
|
||||
```
|
||||
npm start // για να δημιουργήσετε τα build file(s) και να ξεκινήσετε ένα πρόγραμμα παρακολούθυησης αρχείων που τα φορτώνει ξανά κατά την αποθήκευση
|
||||
|
||||
// ή
|
||||
|
||||
npm run build // για να δημιουργήσετε τα build file(s) μία φορά
|
||||
```
|
||||
|
||||
Συγχαρητήρια, τώρα είστε έτοιμος να δημιουργήσετε!
|
||||
|
||||
Εάν είστε νέος στη δημιουργία επεκτάσεων στο Chrome, ή χρειάζεστε επιπλέον βοήθεια, παρακαλώ δείτε [αυτόν τον οδηγό στο YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0)
|
||||
|
||||
### Ζητήματα
|
||||
|
||||
#### Δημιουργώντας ένα νέο ζήτημα
|
||||
|
||||
Εάν αντιμετωπίζετε κάποιο πρόβλημα με την επέκταση, παρακαλώ κάντε μια αναζήτηση για να σιγουρευτείτε ότι το ζήτημα δεν έχει αναφερθεί ήδη. Αν δεν είναι, δημιουργήστε ένα νέο ζήτημα χρησιμοποιώντας την φόρμα ζητημάτων η οποία συστήνεται αλλά δεν είναι απαραίτητη.
|
||||
|
||||
#### Λύνοντας ένα ζήτημα
|
||||
|
||||
Εάν βρήκατε ένα ζήτημα που πιστεύετε ότι ίσως μπορέσετε να λύσετε, μην ντρέπεστε. Ανοίξτε ένα PR με την επιδιόρθωση και φροντίστε να αναφέρετε το πρόβλημα που επιδιορθώνετε.
|
||||
|
||||
### Αίτηση για νέα λειτουργίας
|
||||
|
||||
#### Άνοιγμα αιτήματος νέας λειτουργίας
|
||||
|
||||
Εάν έχετε μια ιδέα για την επέκταση, μη διστάσετε να ανοίξετε ένα αίτημα λειτουργίας, αλλά ψάξτε το προηγουμένως για να βεβαιωθείτε ότι η λειτουργία δεν έχει ήδη προταθεί. Η χρήση της φόρμας για νέες λειτουργίες συστήνεται αλλά δεν είναι απαραίτητη.
|
||||
|
||||
#### Υλοποιώντας ένα αίτημα νέας λειτουργίας
|
||||
|
||||
Αν βρήκατε μια δυνατότητα που πιστεύετε ότι μπορεί να μπορέσετε να εφαρμόσετε, μην ντρέπεστε. Ανοίξτε ένα PR με την επιδιόρθωση και φροντίστε να αναφέρετε τη δυνατότητα που εφαρμόζετε.
|
||||
|
||||
### Τι PR δεχόμαστε;
|
||||
|
||||
- Διορθώσεις ζητημάτων.
|
||||
- Υλοποίηση νέων λειτουργιών.
|
||||
- Τυπογραφικά λάθη ή καλύτερες και πιο εύκολες λέξεις στη χρήση.
|
||||
- Συνεισφορές στην ιστοσελίδα.
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Lees dit in andere talen: [English](CONTRIBUTINGen.md), [русский](CONTRIBUTINGru.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [Español](CONTRIBUTINGes.md)
|
||||
Lees dit in andere talen: [English](CONTRIBUTINGen.md), [русский](CONTRIBUTINGru.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
# Welkom bij de YouTube Dislikes bijdragengids
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
Read this in other languages: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Deutsch](CONTRIBUTINGde.md)
|
||||
|
||||
# Witamy w przewodniku współtworzenia Return YouTube Dislike
|
||||
|
||||
Dziękujemy za zainwestowanie czasu w rozwój naszego projektu! Wszystkie Twoje zmiany znajdą się w następnej wersji rozszerzenia ([bądź strony](https://www.returnyoutubedislike.com/)).
|
||||
|
||||
## Początek
|
||||
|
||||
Prosimy używać Prettier z domyślnymi ustawieniami do formatowania.
|
||||
|
||||
#### Wymagania wstępne
|
||||
|
||||
Musisz mieć zainstalowane node i npm, aby utworzyć dołączoną wersję źródła.
|
||||
|
||||
Wersje używane przy ustawianiu:
|
||||
|
||||
- node: 12.18.4
|
||||
- npm: 6.14.6
|
||||
|
||||
Aby utworzyć `bundled-content-script.js`, które zawiera większość logiki tego rozszerzenia, musisz najpierw zainstalować wszystkie zależności.
|
||||
|
||||
1. Przejdź do korzenia tego repo i uruchom:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Użyj polecenia poniżej aby stworzyć `bundled-content-script.js`, które jest używane w `manifest.json`
|
||||
|
||||
```
|
||||
npm start // aby utworzyć plik(i) build-u i uruchomić obserwatora pliku, który przeładowuje po zapisie
|
||||
|
||||
// lub
|
||||
|
||||
npm run build // aby jednorazowo utworzyć plik(i) build-u
|
||||
```
|
||||
|
||||
Gratulacje, jesteś gotów pisać!
|
||||
|
||||
Jeśli jesteś nowy w pisaniu rozszerzeń do Chrome, lub potrzebujesz dodatkowej pomocy, obejrzyj [ten poradnik na YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0)
|
||||
|
||||
### Problemy
|
||||
|
||||
#### Otwieranie nowego problemu
|
||||
|
||||
Jeśli masz jakiekolwiek problemy z rozszerzeniem, najpierw wyszukaj go aby upewnić się, że dany problem nie został już zgłoszony. Jeżeli nie, otwórz problem. Używanie formularza problemu jest zalecane, ale nie jest konieczne.
|
||||
|
||||
#### Rozwiązywanie problemu
|
||||
|
||||
Jeżeli znalazłeś problem, który myślisz, że jesteś w stanie rozwiązać, nie wstydź się. Otwórz PR z fix-em i opisz problem, który naprawiasz.
|
||||
|
||||
### Prośba o funkcjonalność
|
||||
|
||||
#### Otwieranie nowej prośby o funkcjonalność
|
||||
|
||||
Jeżeli masz pomysł na rozszerzenie, śmiało otwórz nowe żądanie o funkcjonalność, ale prosimy o wyszukanie swojego pomysłu, aby upewnić się, że nie został on już zasugerowany. Używanie formularza jest zalecane, ale nie jest konieczne.
|
||||
|
||||
#### Implementacja prośby o funkcjonalność
|
||||
|
||||
Jeżeli znalazłeś pomysł na funkcjonalność, którą myślisz, że jesteś w stanie zaimplementować, nie wstydź się. Otwórz PR z fix-em, i opisz funkcjonalność, którą implementujesz.
|
||||
|
||||
### Jakie PR-y przyjmujemy?
|
||||
|
||||
- Naprawy problemów.
|
||||
- Implementacja funkcjonalności.
|
||||
- Literówki lub lepsze i łatwiejsze w zrozumieniu słowa.
|
||||
- Współtworzenie strony.
|
||||
@@ -0,0 +1,67 @@
|
||||
Read this in other languages: [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md)
|
||||
|
||||
# Bem-vindo ao Guia de contribuição do Return YouTube Dislikes
|
||||
|
||||
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/)).
|
||||
|
||||
## Vamos ao começo
|
||||
|
||||
Por favor use o Prettir com a configurações padrão de formatação.
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
vocÊ precisa ter node e npm instalado para criar um You need to have node and npm installed to create the bundled version of the source.
|
||||
|
||||
Versões que usará quando estiver trabalhando nisso:
|
||||
|
||||
- node: 12.18.4
|
||||
- npm: 6.14.6
|
||||
|
||||
To create the `bundled-content-script.js` that contains most of the business logic of this extension you have to install all dependencies first.
|
||||
|
||||
1. Vá para a raiz do repositorio e execute:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Execute o seguinte comando para criar `bundled-content-script.js` which (what is?) e usando no `manifest.json`
|
||||
|
||||
```
|
||||
npm start // to create the build file(s) and start a file watcher that hot-reloads on save
|
||||
|
||||
// ou
|
||||
|
||||
npm run build // para criar uma build para cria um arquivo de build
|
||||
```
|
||||
|
||||
Congratulations, You are now ready to develop!
|
||||
|
||||
If you are new to developing Chrome extensions, or need extra help, please see [this YouTube tutorial](https://www.youtube.com/watch?v=mdOj6HYE3_0)
|
||||
|
||||
### Problemas
|
||||
|
||||
#### Abrindo um novo problema
|
||||
|
||||
Se voce tiver qualquer problema com a extensão, por favor pesquisa o que faz o problema antes de reporta-lo de fato. Se não houver, abra um probelma, usando o formulario de problema é recomendado mas não é uma obrigação.
|
||||
|
||||
#### Solucionando um problema
|
||||
|
||||
Se você tiver um problema If you found an issue that you feel you might be able to solve, Não seja "shy"? . Abra um PR(Pull Request)com a correção e faça uma menção do problema que está consertando.
|
||||
|
||||
### Requisitação de Recurso
|
||||
|
||||
#### Abrindo uma nova requisitação de recurso
|
||||
|
||||
Se você tem alguma ideia para a extensão, sinta livre para abrir uma requisitação de recurso, mas por favor pesquise isso antes para não perder seu tempo com sua sugestão. Usando o formulario de recurso é altamente recomendado mas não é um obrigação.
|
||||
|
||||
#### Implementando uma requisitação de recurso
|
||||
|
||||
If you found a feature that you feel you might be able to implement, don't be shy. Open a PR with the fix and make sure to mention the feature you are implementing.
|
||||
|
||||
### What PRs do we accept?
|
||||
|
||||
- Resolução de problemas.
|
||||
- Implementação de recurso.
|
||||
- Marcação, melhoria facilitação de palavras usadas.
|
||||
- Contribuição para o Website.
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
Прочитать на других языках: [English](CONTRIBUTING.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
Прочитать на других языках: [English](CONTRIBUTING.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
# Добро пожаловать в руководство по внесению вклада Return YouTube Dislikes
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Bunu diğer dillerde okuyun: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [українська](CONTRIBUTINGuk.md), [Español](CONTRIBUTINGes.md)
|
||||
Bunu diğer dillerde okuyun: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Nederlands](CONTRIBUTINGnl.md), [Français](CONTRIBUTINGfr.md), [українська](CONTRIBUTINGuk.md), [Polski](CONTRIBUTINGpl.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
# "YouTube Dislike Sayısını Geri Getir"in katkı kılavuzuna Hoş Geldiniz
|
||||
|
||||
|
||||
+67
-67
@@ -1,67 +1,67 @@
|
||||
Read this in other languages: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
# Вітаємо у посібнику внеску в Return YouTube Dislikes
|
||||
|
||||
Дякуємо, що вкладаєте свій час у розвиток нашого проєкту! Усі ваші зміни буде відображено в наступній версії розширення (або ж [вебсайту](https://www.returnyoutubedislike.com/)).
|
||||
|
||||
## Почнімо працювати
|
||||
|
||||
Будь ласка, використовуйте Prettier із налаштуваннями за замовчуванням для форматування коду.
|
||||
|
||||
#### Заздалегідь
|
||||
|
||||
Вам потрібно встановити node і npm, щоб створити bundled версію джерела.
|
||||
|
||||
Версії, що використовувались при налаштуванні:
|
||||
|
||||
- node: 12.18.4
|
||||
- npm: 6.14.6
|
||||
|
||||
Для створення `bundled-content-script.js`, який містить більшу частину бізнес-логіки цього розширення, спочатку потрібно встановити всі залежності.
|
||||
|
||||
1. Перейдіть в корінь репозиторію та виконайте наступне:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Виконайте наступну команду, щоб створити `bundled-content-script.js`, який використовується в `manifest.json`
|
||||
|
||||
```
|
||||
npm start // для створення файлу(ів) збірки та запуску спостерігача за файлами, який виконує hot-reload при збереженні
|
||||
|
||||
// або ж
|
||||
|
||||
npm run build // для створення файлу(ів) збірки один раз
|
||||
```
|
||||
|
||||
Вітаємо, тепер ви готові до розробки!
|
||||
|
||||
Якщо ви новачок у розробці розширення Chrome або вам потрібна додаткова допомога, перегляньте [це керівництво на YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) (англ.)
|
||||
|
||||
### Проблеми
|
||||
|
||||
#### Відкриття нової проблеми
|
||||
|
||||
Якщо у вас виникли проблеми з розширенням, здійсніть пошук і переконайтеся, що про цю проблему ще не повідомляли. Якщо ні, створіть Issue, використання форми проблеми наполегливо рекомендується, але не є обов’язковим.
|
||||
|
||||
#### Вирішення проблеми
|
||||
|
||||
Якщо ви знайшли проблему, і гадаєте, що можете її вирішити, не соромтеся. Створіть Pull Request на вилучення з виправленням і обов'язково вкажіть проблему, яку ви усуваєте.
|
||||
|
||||
### Запит функції
|
||||
|
||||
#### Відкриття запиту на нову функцію
|
||||
|
||||
Якщо у вас є ідея щодо розширення, не соромтеся створіть Pull Request, але, будь ласка, здійсніть пошук і переконайтеся, що ця функція ще не запропонована. Використання форми функції наполегливо рекомендується, але не є обов’язковим.
|
||||
|
||||
#### Реалізація запиту функції
|
||||
|
||||
Якщо ви знайшли функцію, і гадаєте, що можете її реалізувати, не соромтеся. Створіть Pull Request із виправленням і обов’язково вкажіть функцію, яку ви впроваджуєте.
|
||||
|
||||
### Які Pull Request ми приймаємо?
|
||||
|
||||
- Виправлення проблем.
|
||||
- Впровадження нових функцій.
|
||||
- Виправлення помилок та спрощення тексту.
|
||||
- Поліпшення сайту.
|
||||
Read this in other languages: [English](CONTRIBUTING.md), [русский](CONTRIBUTINGru.md), [Français](CONTRIBUTINGfr.md), [Türkçe](CONTRIBUTINGtr.md), [Polski](CONTRIBUTINGpl.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md)
|
||||
|
||||
# Вітаємо у посібнику внеску в Return YouTube Dislikes
|
||||
|
||||
Дякуємо, що вкладаєте свій час у розвиток нашого проєкту! Усі ваші зміни буде відображено в наступній версії розширення (або ж [вебсайту](https://www.returnyoutubedislike.com/)).
|
||||
|
||||
## Почнімо працювати
|
||||
|
||||
Будь ласка, використовуйте Prettier із налаштуваннями за замовчуванням для форматування коду.
|
||||
|
||||
#### Заздалегідь
|
||||
|
||||
Вам потрібно встановити node і npm, щоб створити bundled версію джерела.
|
||||
|
||||
Версії, що використовувались при налаштуванні:
|
||||
|
||||
- node: 12.18.4
|
||||
- npm: 6.14.6
|
||||
|
||||
Для створення `bundled-content-script.js`, який містить більшу частину бізнес-логіки цього розширення, спочатку потрібно встановити всі залежності.
|
||||
|
||||
1. Перейдіть в корінь репозиторію та виконайте наступне:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Виконайте наступну команду, щоб створити `bundled-content-script.js`, який використовується в `manifest.json`
|
||||
|
||||
```
|
||||
npm start // для створення файлу(ів) збірки та запуску спостерігача за файлами, який виконує hot-reload при збереженні
|
||||
|
||||
// або ж
|
||||
|
||||
npm run build // для створення файлу(ів) збірки один раз
|
||||
```
|
||||
|
||||
Вітаємо, тепер ви готові до розробки!
|
||||
|
||||
Якщо ви новачок у розробці розширення Chrome або вам потрібна додаткова допомога, перегляньте [це керівництво на YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) (англ.)
|
||||
|
||||
### Проблеми
|
||||
|
||||
#### Відкриття нової проблеми
|
||||
|
||||
Якщо у вас виникли проблеми з розширенням, здійсніть пошук і переконайтеся, що про цю проблему ще не повідомляли. Якщо ні, створіть Issue, використання форми проблеми наполегливо рекомендується, але не є обов’язковим.
|
||||
|
||||
#### Вирішення проблеми
|
||||
|
||||
Якщо ви знайшли проблему, і гадаєте, що можете її вирішити, не соромтеся. Створіть Pull Request на вилучення з виправленням і обов'язково вкажіть проблему, яку ви усуваєте.
|
||||
|
||||
### Запит функції
|
||||
|
||||
#### Відкриття запиту на нову функцію
|
||||
|
||||
Якщо у вас є ідея щодо розширення, не соромтеся створіть Pull Request, але, будь ласка, здійсніть пошук і переконайтеся, що ця функція ще не запропонована. Використання форми функції наполегливо рекомендується, але не є обов’язковим.
|
||||
|
||||
#### Реалізація запиту функції
|
||||
|
||||
Якщо ви знайшли функцію, і гадаєте, що можете її реалізувати, не соромтеся. Створіть Pull Request із виправленням і обов’язково вкажіть функцію, яку ви впроваджуєте.
|
||||
|
||||
### Які Pull Request ми приймаємо?
|
||||
|
||||
- Виправлення проблем.
|
||||
- Впровадження нових функцій.
|
||||
- Виправлення помилок та спрощення тексту.
|
||||
- Поліпшення сайту.
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md),[Türkçe](FAQtr.md), [українська](FAQuk.md)
|
||||
Read this in other languages: [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md), [Português do Brasil](FAQpt_BRmd)
|
||||
|
||||
|
||||
# Frequently Asked Questions
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
Read this in other languages: [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
||||
|
||||
# Häufig gestellte Fragen
|
||||
|
||||
## Bevor Sie eine Frage auf GitHub oder Discord stellen, sehen Sie bitte hier nach.
|
||||
|
||||
<br>
|
||||
|
||||
### **1. Woher stammt die Datenquelle dieser Erweiterung?**
|
||||
|
||||
Eine Kombination aus Google-APIs und gescrapten Daten.
|
||||
|
||||
Wir speichern alle verfügbaren Daten in unserer Datenbank, damit sie verfügbar sind, nachdem Google die Anzahl der Dislikes in ihrer API abschaltet.
|
||||
|
||||
<br>
|
||||
|
||||
### **2. Die Anzahl der Dislikes bei Videos aktualisiert sich nicht**
|
||||
|
||||
Aktuell werden die Dislikes bei Videos zwischengespeichert und nicht sehr häufig aktualisiert. Etwa alle 2-3 Tage, nicht öfter.
|
||||
|
||||
Ja, das ist nicht ideal, aber es ist wie es ist. Wir arbeiten daran, wie oft wir sie aktualisieren können, zu verbessern.
|
||||
|
||||
<br>
|
||||
|
||||
### **3. Wie funktioniert das?**
|
||||
|
||||
Die Erweiterung sammelt die Video-ID des von Ihnen angesehenen Videos, ruft die Dislikes (und andere Felder wie Aufrufe, Likes usw.) über unsere API ab. Wenn dies das erste Mal ist, dass das Video von unserer API abgerufen wurde, wird die YouTube-API verwendet, um die Daten zu erhalten. Anschließend werden die Daten für den Zwischenspeicher (ca. 2-3 Tage zwischengespeichert) und Archivierungszwecke in einer Datenbank gespeichert und an Sie zurückgegeben. Die Erweiterung zeigt Ihnen dann die Dislikes an.
|
||||
|
||||
<br>
|
||||
|
||||
### **4. Was passiert, wenn die YouTube-API aufhört, die Anzahl der Dislikes zurückzugeben?**
|
||||
|
||||
Der Backend wird auf eine Kombination aus archivierten Dislike-Statistiken, Schätzungen, die aus den Daten der Erweiterungsnutzer extrapoliert werden, und Schätzungen basierend auf Ansichts-/Like-Verhältnissen für Videos, deren Dislikes nicht archiviert wurden, und veralteten Dislike-Archiven umstellen.
|
||||
|
||||
<br>
|
||||
|
||||
### **5. Wie wird die Anzahl der Dislikes berechnet?**
|
||||
|
||||
RYD verwendet die Stimmen seiner Benutzer, um die Anzahl der Dislikes zu extrapolieren.
|
||||
|
||||
- Wenn das Video nach dem Abschalten der API hochgeladen wurde:
|
||||
|
||||
$$ \textup{RYD Dislike Count} = \left( \frac{\textup{RYD Users Dislike Count}}{\textup{RYD Users Like Count}} \right) \times \textup{Public Like Count} $$
|
||||
|
||||
- Wenn die RYD-Datenbank auf irgendeine Weise die tatsächliche Anzahl von Likes und Dislikes enthielt (vom Ersteller bereitgestellt oder aus dem Archiv), wird die Anzahl der Dislikes basierend auf beiden - den Stimmen der Benutzer und dem archivierten Wert - berechnet. Der archivierte Wert wird mit zunehmendem Alter weniger Einfluss auf die endgültige Zählung haben.
|
||||
|
||||
<br>
|
||||
|
||||
---
|
||||
|
||||
Dies in Videoform
|
||||
|
||||
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
|
||||
## Ich habe Sicherheits-/Privatsphärebedenken
|
||||
|
||||
Siehe [diese Seite](SECURITY-FAQde.md) für weitere Informationen.
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
Lisez ceci dans d'autres langues : [English](FAQ.md), [русский](FAQru.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md)
|
||||
|
||||
Lisez ceci dans d'autres langues : [English](FAQ.md), [русский](FAQru.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md)
|
||||
|
||||
# Foire Aux Questions
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Lees dit in andere talen: [Engels](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md)
|
||||
Lees dit in andere talen: [Engels](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md)
|
||||
|
||||
# Veel Gestelde Vragen
|
||||
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Deutsch](FAQde.md)
|
||||
|
||||
# Często zadawane pytania
|
||||
|
||||
## Przeczytaj poniższe przed zadawaniem pytań na GitHubie lub Discordzie.
|
||||
|
||||
<br>
|
||||
|
||||
### **1.Skąd rozszerzenie otrzymuje swoje dane?**
|
||||
|
||||
Kombinacja API Google i danych scrape-owanych.
|
||||
|
||||
Zapisujemy wszystkie dostępne dane do naszej bazy danych, żeby były dostępne po tym jak Google wyłączy liczniki łapek w dół w swoim API.
|
||||
|
||||
<br>
|
||||
|
||||
### **2. Licznik łapek w dół się nie aktualizuje**
|
||||
|
||||
Na chwile obecną łapki w dół są buforowane i nie są bardzo często aktualizowane. Raz na 2-3 dni, nie częściej.
|
||||
|
||||
No nie jest to idealne, ale tak już jest. Pracujemy nad tym jak częściej możemy to aktualizować.
|
||||
|
||||
<br>
|
||||
|
||||
### **3. Jak to działa?**
|
||||
|
||||
Rozszerzenie zbiera ID filmu, którego oglądasz, pobiera ilość łapek w dół (i inne pola, takie jak wyświetlenia, łapki w górę itd.) za pomocą naszego API. Jeżeli film jest pierwszy raz pobrany przez nasze API, zostanie użyte YouTube API do pobrania danych, a potem przechowania w bazie danych do buforu (przez jakieś 2-3 dni) i archiwizacji, po czym zwracane jest Tobie. Rozszerzenie potem wyświetla ilość łapek w dół.
|
||||
|
||||
<br>
|
||||
|
||||
### **4. Co się wydarzy gdy YouTube API przestanie zwracać liczbę łapek w dół?**
|
||||
|
||||
Backend przełączy się na używanie kombinacji zarchiwizowanych statystyk łapek w dół, szacunków ekstrapolowanych z danych użytkowników rozszerzenia i szacowań opartych na stosunkach wyświetleń/łapek w górę dla filmów, których ilość łapek w dół nie została zarchiwizowana i dla przestarzałych archiwów.
|
||||
|
||||
<br>
|
||||
|
||||
### **5. Jak wyliczana jest liczba łapek w dół?**
|
||||
|
||||
RYD używa głosów użytkowników, aby ekstrapolować liczbę łapek w dół.
|
||||
|
||||
- Jeżeli film został wrzucony przed wyłączeniem API:
|
||||
|
||||
$$ \textup{Liczba łapek w dół RYD} = \left( \frac{\textup{Liczba łapek w dół użytkowników RYD}}{\textup{Liczba łapek w górę użytkowników RYD}} \right) \times \textup{Publiczna liczba łapek w górę} $$
|
||||
|
||||
- Jeśli baza danych RYD jakimś cudem miałaby prawidłową liczbę łapek w górę i dół (zapewnione przez twórce lub z archiwum), liczba łapek w dół będzie obliczana w oparciu jednocześnie głosów użytkowników i wartości zarchiwizowanych. Zarchiwizowana wartość będzie miała mniejszy wpływ na ostateczną liczbę z biegiem czasu.
|
||||
|
||||
<br>
|
||||
|
||||
---
|
||||
|
||||
To samo w formie filmu.
|
||||
|
||||
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
|
||||
## Mam zastrzeżenia co do bezpieczeństwa / prywatności
|
||||
|
||||
Przejdź [tutaj](SECURITY-FAQ.md) aby uzyskać więcej informacji.
|
||||
@@ -0,0 +1,61 @@
|
||||
Leia isso em outros Idiomas: [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md)
|
||||
|
||||
# Frequently Asked Questions
|
||||
|
||||
## Before asking a question on GitHub or Discord, please refer to this.
|
||||
|
||||
<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 its 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 Dislike Count}}{\textup{RYD Users Like 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>
|
||||
|
||||
---
|
||||
|
||||
Essa a This in video form
|
||||
|
||||
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
|
||||
## I have security / privacy concerns
|
||||
|
||||
See [this page](SECURITY-FAQpt_BR.md) for more info.
|
||||
+6
-2
@@ -1,25 +1,29 @@
|
||||
Read this in other languages: [English](FAQ.md), [Nederlands](FAQnl.md), Français](FAQfr.md), [Türkçe](FAQtr.md), [українська](FAQuk.md)
|
||||
|
||||
Read this in other languages: [English](FAQ.md), [Nederlands](FAQnl.md), [Français](FAQfr.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md)
|
||||
|
||||
# Часто задаваемые вопросы
|
||||
|
||||
## Прежде чем задать вопрос на GitHub или в Discord, пожалуйста, ознакомьтесь с этим.
|
||||
|
||||
### **1. Откуда это расширение получает данные?**
|
||||
|
||||
Комбинация API Google и старых данных.
|
||||
|
||||
Мы сохраняем все имеющиеся данные в нашей базе данных, чтобы они были доступны после того, как Google прекратит подсчёт отметок «Не нравится» в своём API.
|
||||
|
||||
### **2. Количество не понравившихся видео не обновляется**
|
||||
|
||||
В настоящее время видео с отметками «Не нравится» кэшируются и обновляются не очень часто. Раз в 2-3 дня, не чаще.
|
||||
|
||||
Да, это не идеально, но это то, что есть. Мы работаем над тем, чтобы улучшить частоту их обновления.
|
||||
|
||||
### **3. Как это работает?**
|
||||
|
||||
Расширение собирает идентификатор видео, которое вы смотрите, извлекает данные об отметках «Не нравится» (и другие поля, такие как просмотры, отметки «Нравится» и т.д.) с помощью нашего API, если видео было извлечено нашим API впервые, оно использует YouTube API для получения данных, затем сохраняет данные в базе данных для кэширования (кэшируются около 2-3 дней) и архивирования и возвращает их вам. После этого расширение отображает отметки «Не нравится» вам.
|
||||
|
||||
### **4. Что произойдёт после того, как API YouTube перестанет возвращать данные о количестве отметок «Не нравится»?**
|
||||
|
||||
Внутренняя часть нашего сервера переключится на использование комбинации архивных статистик отметок «Не нравится», оценок, экстраполированных из данных о пользователях расширения, и оценок, основанных на соотношении просмотров и отметок «Нравится» для видео, чьи отметки «Не нравится» не были заархивированы, и для устаревших архивов с отметками «Не нравится».
|
||||
|
||||
## Я беспокоюсь о безопасности / конфиденциальности
|
||||
|
||||
Более подробную информацию смотрите на [этой странице](SECURITY-FAQ.md).
|
||||
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
Bunu diğer dillerde okuyun: [English](FAQ.md), [русский](FAQru.md), ), [Nederlands](FAQnl.md), [Français](FAQfr.md), [українська](FAQuk.md)
|
||||
|
||||
Bunu diğer dillerde okuyun: [English](FAQ.md), [русский](FAQru.md), [Nederlands](FAQnl.md), [Français](FAQfr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md)
|
||||
|
||||
# Sıkça Sorulan Sorular
|
||||
|
||||
|
||||
+61
-61
@@ -1,61 +1,61 @@
|
||||
Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md)
|
||||
|
||||
# Часті питання
|
||||
|
||||
## Перш ніж задавати питання на GitHub або у Discord, будь ласка, ознайомтеся з цим.
|
||||
|
||||
<br>
|
||||
|
||||
### **1. Звідки це розширення отримує дані?**
|
||||
|
||||
Комбінація Google API та старих даних.
|
||||
|
||||
Ми зберігаємо всі доступні дані в нашій базі, аби вони були доступні після того, як Google вимкне лічильник відміток «Не подобається» у своєму API.
|
||||
|
||||
<br>
|
||||
|
||||
### **2. Лічильник «Не подобається» не оновлюється**
|
||||
|
||||
Наразі відео з відмітками «Не подобається» кешуються і оновлюються не надто часто. Не частіше, ніж раз в 2-3 дні.
|
||||
|
||||
Так, це не ідеально, але маємо те, що маємо. Ми працюємо над тим, щоб збільшити частоту їх оновлення.
|
||||
|
||||
<br>
|
||||
|
||||
### **3. Як це працює?**
|
||||
|
||||
Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API, якщо відео було витягнуте нашим API вперше, воно використовує YouTube API для отримання даних, потім зберігає дані в базі даних для кешування (кешуються близько 2-3 днів) та архівування й повертає їх вам. Після цього розширення відображає відмітки «Не подобається» вам.
|
||||
|
||||
<br>
|
||||
|
||||
### **4. Що станеться після того, як YouTube API перестане повертати кількість відміток «Не подобається»?**
|
||||
|
||||
Сервер перейде на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними .
|
||||
|
||||
<br>
|
||||
|
||||
### **5. Як розраховується кількість відміток «Не подобається»?**
|
||||
|
||||
RYD використовує відмітки своїх користувачів, щоб екстраполювати кількість відміток «Не подобається».
|
||||
|
||||
- Якщо відео було завантажено після вимкнення API:
|
||||
|
||||
$$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Подобається» серед користувачів RYD}}{\textup{К-ть відміток «Не подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$
|
||||
|
||||
- Якщо база даних RYD якимось чином мала фактичну кількість відміток «Подобається» та «Не подобається» (надану завантажувачем або з архіву), кількість відміток «Не подобається» буде розраховано на основі відміток користувачів і архівного значення. Архівне значення матиме менший вплив на остаточний підрахунок у міру актуальності.
|
||||
|
||||
<br>
|
||||
|
||||
---
|
||||
|
||||
Це все, але у відео форматі
|
||||
|
||||
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
|
||||
## Я турбуюся про безпеку/конфіденційність
|
||||
|
||||
Детальніше про це дивіться [тут](SECURITY-FAQuk.md).
|
||||
Read this in other languages: [English](FAQ.md), [русский](FAQru.md), [Français](FAQfr.md), [Türkçe](FAQtr.md), [Deutsch](FAQde.md)
|
||||
|
||||
# Часті питання
|
||||
|
||||
## Перш ніж задавати питання на GitHub або у Discord, будь ласка, ознайомтеся з цим.
|
||||
|
||||
<br>
|
||||
|
||||
### **1. Звідки це розширення отримує дані?**
|
||||
|
||||
Комбінація Google API та старих даних.
|
||||
|
||||
Ми зберігаємо всі доступні дані в нашій базі, аби вони були доступні після того, як Google вимкне лічильник відміток «Не подобається» у своєму API.
|
||||
|
||||
<br>
|
||||
|
||||
### **2. Лічильник «Не подобається» не оновлюється**
|
||||
|
||||
Наразі відео з відмітками «Не подобається» кешуються і оновлюються не надто часто. Не частіше, ніж раз в 2-3 дні.
|
||||
|
||||
Так, це не ідеально, але маємо те, що маємо. Ми працюємо над тим, щоб збільшити частоту їх оновлення.
|
||||
|
||||
<br>
|
||||
|
||||
### **3. Як це працює?**
|
||||
|
||||
Розширення отримує ID відео, яке ви переглядаєте, та дізнається кількість відміток «Не подобається» (та інші дані: перегляди, відмітки «Подобається» тощо) за допомогою нашого API, якщо відео було витягнуте нашим API вперше, воно використовує YouTube API для отримання даних, потім зберігає дані в базі даних для кешування (кешуються близько 2-3 днів) та архівування й повертає їх вам. Після цього розширення відображає відмітки «Не подобається» вам.
|
||||
|
||||
<br>
|
||||
|
||||
### **4. Що станеться після того, як YouTube API перестане повертати кількість відміток «Не подобається»?**
|
||||
|
||||
Сервер перейде на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними .
|
||||
|
||||
<br>
|
||||
|
||||
### **5. Як розраховується кількість відміток «Не подобається»?**
|
||||
|
||||
RYD використовує відмітки своїх користувачів, щоб екстраполювати кількість відміток «Не подобається».
|
||||
|
||||
- Якщо відео було завантажено після вимкнення API:
|
||||
|
||||
$$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Подобається» серед користувачів RYD}}{\textup{К-ть відміток «Не подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$
|
||||
|
||||
- Якщо база даних RYD якимось чином мала фактичну кількість відміток «Подобається» та «Не подобається» (надану завантажувачем або з архіву), кількість відміток «Не подобається» буде розраховано на основі відміток користувачів і архівного значення. Архівне значення матиме менший вплив на остаточний підрахунок у міру актуальності.
|
||||
|
||||
<br>
|
||||
|
||||
---
|
||||
|
||||
Це все, але у відео форматі
|
||||
|
||||
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
|
||||
## Я турбуюся про безпеку/конфіденційність
|
||||
|
||||
Детальніше про це дивіться [тут](SECURITY-FAQuk.md).
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
Read this in other languages: [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md)
|
||||
|
||||
Read this in other languages: [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md)
|
||||
|
||||
# Security
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
Read this in other languages: [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md)
|
||||
|
||||
|
||||
# Sicherheit
|
||||
|
||||
### Verfolgen Sie meine Anzeigehistorie?
|
||||
|
||||
Nein. Der Code der Erweiterung ist öffentlich und Sie können ihn selbst einsehen. Die einzige übermittelte Information ist die Video-ID, die benötigt wird, um die Anzahl der Dislikes für die Videos abzurufen. Es werden keine zusätzlichen Header gesendet. Über die Kommunikationsschicht wird Ihre öffentliche IP-Adresse an den Server übermittelt, sowie die Zeit, zu der die Anfrage gestellt wurde. Keine dieser Informationen identifiziert Sie auf eindeutige Weise. Unter der Annahme einer Zero-Trust-Umgebung ist das Beste, was wir bekommen können, eine dynamische IP. Die heute Ihnen gehört, gehört morgen Ihrem Nachbarn. Wenn Sie sich wirklich Sorgen machen, dass Ihre IP zurückverfolgt wird, verwenden Sie wahrscheinlich bereits ein VPN.
|
||||
|
||||
### Können Sie mich eindeutig identifizieren, wenn ich etwas dislike?
|
||||
|
||||
Ja. Wenn Sie ein Video nicht mögen, erstellen wir eine zufällig generierte eindeutige ID für Sie, die nicht mit Ihrem Google-Konto verknüpft ist. Dies geschieht, um das Botting zu verhindern. Es gibt jedoch keine Möglichkeit, diese zufällige ID mit Ihnen oder Ihrem persönlichen YouTube-Konto zu verknüpfen.
|
||||
|
||||
### Welche Informationen haben Sie genau?
|
||||
|
||||
Nur die Video-ID. Nicht Ihre Kommentare, nicht Ihren Benutzernamen, nicht mit wem Sie das Video geteilt haben, keine zusätzlichen Metadaten. Nichts. Nur die Video-ID.
|
||||
|
||||
### Wie wird meine IP gespeichert?
|
||||
|
||||
Der Backend speichert nicht gehashte IP-Adressen nur im flüchtigen Speicher (RAM). Diese Adressen werden nicht auf einer Festplatte gespeichert und daher nicht protokolliert. Wir hashen die IP-Adressen und speichern diese stattdessen. Dies geschieht, um Datenbankvandalismus zu verhindern.
|
||||
|
||||
### Ich habe etwas über OAuth gehört und den Zugriff auf mein YouTube-Konto!
|
||||
|
||||
Diese Funktion wird optional sein und sehr stark opt-in. Wenn Sie ein YouTube-Ersteller sind und Ihre Dislike-Statistiken mit uns teilen möchten, können Sie dies tun. Die Art und Weise, wie [OAuth](https://en.wikipedia.org/wiki/OAuth#:~:text=but%20without%20giving%20them%20the%20passwords.) strukturiert wurde, ist tatsächlich sehr sicher. Sie können den Zugriff auf Ihr Konto jederzeit widerrufen und uns sehr spezifische Berechtigungen erteilen. Wir werden nicht nach Berechtigungen fragen, die nicht erforderlich sind. Wir werden nur um Berechtigungen bitten, um Ihre Video-Statistiken anzeigen zu können.
|
||||
|
||||
### Wie kann ich diesem Dislike-Zähler vertrauen?
|
||||
|
||||
Wir haben Maßnahmen implementiert, um Bot-Angriffe zu verhindern, und werden weiterhin daran arbeiten, die Effektivität des Bot-Präventionssystems zu verbessern: Dies wird uns helfen, den Dislike-Zähler als gute Repräsentation der tatsächlichen Anzahl zu halten. Natürlich wird es nie zu 100% genau sein, also liegt es an Ihnen zu entscheiden, ob Sie dem Zähler vertrauen oder nicht.
|
||||
|
||||
### Warum teilen Sie den Backend-Code nicht?
|
||||
|
||||
Wir werden ihn irgendwann teilen - aber es gibt wirklich keinen echten Grund, ihn jetzt zu teilen. Es vermittelt ein falsches Sicherheitsgefühl - denn in einem Zero-Trust-System könnten wir genauso gut eine Version offenlegen, aber eine andere bereitstellen. Es gibt viele Gründe, den Code verborgen zu halten, insbesondere wie wir gegen Spam kämpfen. Das Verbergen/Verfremden des Spam-Behandlungscodes ist eine ziemlich standardmäßige Praxis.
|
||||
@@ -1,4 +1,4 @@
|
||||
Lisez ceci dans d'autres langues : [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), Nederlands](SECURITY_FAQnl.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md)
|
||||
Lisez ceci dans d'autres langues : [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md)
|
||||
|
||||
# Sécurité
|
||||
|
||||
|
||||
+11
-11
@@ -1,30 +1,30 @@
|
||||
Lees dit in andere talen: [English](SECURITY_FAQ.md), [русский](SECURITY-FAQru.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md)
|
||||
Lees dit in andere talen: [English](SECURITY_FAQ.md), [русский](SECURITY-FAQru.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md)
|
||||
|
||||
# Veiligheid
|
||||
|
||||
### Houd je mijn kijkgeschiedenis bij?
|
||||
|
||||
Nee. De code van de extensie is openbaar en u kunt deze zelf zien. De enige informatie die wordt verzonden, is de video-ID, die
|
||||
nodig is om het aantal dislikes voor de video's op te halen. Er worden geen extra headers verzonden. Via de communicatielaag
|
||||
wordt uw openbare IP-adres zichtbaar voor de server, evenals het tijdstip waarop het verzoek is gedaan. Geen van deze
|
||||
identificeert u echter op enigerlei wijze uniek. Uitgaande van een zero-trust-omgeving, is het beste wat we kunnen krijgen een
|
||||
dynamisch IP-adres. Wat vandaag van jou is, morgen van je buurman. Als u zich echt zorgen maakt dat uw IP-adres wordt
|
||||
Nee. De code van de extensie is openbaar en u kunt deze zelf zien. De enige informatie die wordt verzonden, is de video-ID, die
|
||||
nodig is om het aantal dislikes voor de video's op te halen. Er worden geen extra headers verzonden. Via de communicatielaag
|
||||
wordt uw openbare IP-adres zichtbaar voor de server, evenals het tijdstip waarop het verzoek is gedaan. Geen van deze
|
||||
identificeert u echter op enigerlei wijze uniek. Uitgaande van een zero-trust-omgeving, is het beste wat we kunnen krijgen een
|
||||
dynamisch IP-adres. Wat vandaag van jou is, morgen van je buurman. Als u zich echt zorgen maakt dat uw IP-adres wordt
|
||||
getraceerd, gebruikt u waarschijnlijk al een VPN.
|
||||
|
||||
### Kun je me uniek identificeren als ik een hekel heb?
|
||||
|
||||
Ja. Als je een video niet leuk vindt, maken we een willekeurig gegenereerde unieke ID voor je die niet is gekoppeld aan je
|
||||
Google-account. Dit wordt gedaan om botting te voorkomen. Maar er is geen manier om deze willekeurige id aan jou of je
|
||||
Ja. Als je een video niet leuk vindt, maken we een willekeurig gegenereerde unieke ID voor je die niet is gekoppeld aan je
|
||||
Google-account. Dit wordt gedaan om botting te voorkomen. Maar er is geen manier om deze willekeurige id aan jou of je
|
||||
persoonlijke YouTube-account te koppelen.
|
||||
|
||||
### Welke informatie heb je precies?
|
||||
|
||||
Alleen de video-ID. Niet je opmerkingen, niet je gebruikersnaam, niet met wie je de video hebt gedeeld, geen aanvullende
|
||||
Alleen de video-ID. Niet je opmerkingen, niet je gebruikersnaam, niet met wie je de video hebt gedeeld, geen aanvullende
|
||||
metadata. Niks. Alleen de video-ID.
|
||||
|
||||
### Hoe wordt mijn IP opgeslagen?
|
||||
|
||||
De backend bewaart niet-gehashte IP-adressen alleen in vluchtig geheugen (RAM). Deze adressen worden niet opgeslagen op een
|
||||
De backend bewaart niet-gehashte IP-adressen alleen in vluchtig geheugen (RAM). Deze adressen worden niet opgeslagen op een
|
||||
harde schijf en worden daarom niet gelogd. We hashen de IP-adressen en dat wordt in plaats daarvan opgeslagen. Dit wordt gedaan
|
||||
om databasevandalisme te voorkomen.
|
||||
|
||||
@@ -38,4 +38,4 @@ We hebben maatregelen genomen om botaanvallen te voorkomen en zullen blijven wer
|
||||
|
||||
### Waarom deel je de backend-code niet?
|
||||
|
||||
We zullen het op een gegeven moment delen - maar er is echt geen echte reden om het nu te delen. Het geeft een vals gevoel van veiligheid - omdat we in een zero-trust-systeem net zo goed de ene versie kunnen onthullen, maar een andere kunnen implementeren. Er zijn tal van redenen om de code verborgen te houden, met name hoe we spam bestrijden. Het verbergen/verduisteren van de spamverwerkingscode is een vrij standaardpraktijk.
|
||||
We zullen het op een gegeven moment delen - maar er is echt geen echte reden om het nu te delen. Het geeft een vals gevoel van veiligheid - omdat we in een zero-trust-systeem net zo goed de ene versie kunnen onthullen, maar een andere kunnen implementeren. Er zijn tal van redenen om de code verborgen te houden, met name hoe we spam bestrijden. Het verbergen/verduisteren van de spamverwerkingscode is een vrij standaardpraktijk.
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Deutsch](SECURITY-FAQde.md)
|
||||
|
||||
# Security
|
||||
|
||||
### Czy śledzicie moją historię wyświetleń?
|
||||
|
||||
Nie. Kod rozszerzenia jest publiczny i można samemu to zobaczyć. Jedyne informacje, które są wysyłane, to ID filmu, które jest wymagane do pobrania liczby łapek w dół dla filmów. Nie są wysyłane żadne dodatkowe nagłówki. W warstwie sieciowej, Twój adres IP będzie jawny dla serwera wraz z czasem wykonania żądania. Jednakże, żadne z tych danych nie identyfikują Ciebie jednoznacznie w żaden sposób. Zakładając środowisko zerowego zaufania, najczulsze dane, jakie możemy otrzymać, jest dynamiczny adres IP, który dzisiaj jest Twój, a jutro Twojego sąsiada. Jeżeli boisz się śledzenia poprzez adres IP, pewnie już korzystasz z VPN.
|
||||
|
||||
### Czy możecie mnie jednoznacznie zidentyfikować, jeżeli zostawię łapkę w dół?
|
||||
|
||||
Tak. Kiedy zostawiasz łapkę w dół, tworzymy losowo generowane ID dla Ciebie, które nie jest związane z Twoim kontem Google. Powodem takiego rozwiązania jest zapobieganie botowaniu. Mimo to, nie ma sposobu powiązania tego losowego ID z Tobą lub Twoim osobistym kontem Google.
|
||||
|
||||
### Jakie informacje wy macie, konkretnie?
|
||||
|
||||
Tylko ID filmu. Komentarze - nie. Nazwa użytkownika - nie. Osoby, którym udostępniłeś film - nie. Jakiekolwiek dodatkowe metadane - nie. Nic. Tylko ID filmu.
|
||||
|
||||
### Jak mój adres IP jest przechowywany?
|
||||
|
||||
Backend trzyma niehashowane adresy IP tylko w pamięci zmiennej (RAM). Te adresy nie są przechowywane na dysku twardym, przez co nie są rejestrowane. Zamiast tego przechowujemy zhashowany adres IP. Jest to zrobione po to aby zapobiec wandalizmom.
|
||||
|
||||
### Słyszałem jakąś dyskusję o OAuth, i dostępie do mojego konta YouTube.
|
||||
|
||||
Ta funkcjonalność będzie opcjonalna i z całą pewnością wymagała ręcznego dołączenia. Jeżeli jesteś twórcą na YouTube i chcesz podzielić się z nami swoimi statystykami, to możesz. Sposób w jaki [OAuth](https://en.wikipedia.org/wiki/OAuth#:~:text=but%20without%20giving%20them%20the%20passwords.) został ustrukturyzowany jest właściwie bardzo bezpieczny. Możesz wycofać dostęp do konta w każdej chwili i dać nam specyficzne uprawnienia. Nie będziemy prosić o żadne uprawnienia, które nie są wymagane. Poprosimy tylko o możliwość wyświetlenia statystyk filmów.
|
||||
|
||||
### Jak bardzo mogę ufać licznikowi łapek w dół?
|
||||
|
||||
Zaimplementowaliśmy środki zapobiegające atakom botów i będziemy kontynuować pracę nad systemem zapobiegającym botom: to pomoże nam utrzymać licznik łapek w dół jako dobrą reprezentację prawdziwej wartości. Oczywiście, wartość ta nigdy nie będzie w 100% dokładna, więc to czy zaufasz tej liczbie zależy tylko od Ciebie.
|
||||
|
||||
### Dlaczego nie udostępnicie kodu backendu?
|
||||
|
||||
Kiedyś go udostępnimy - ale nie ma za bardzo sensu robić to teraz. Wprowadziłoby to fałszywe poczucie bezpieczeństwa - bo w systemie zerowego zaufania równie dobrze moglibyśmy przedstawić jeden system, a uruchomić inny. Jest dużo powodów do ukrywania kodu, specyficznie do walki ze spamem. Ukrywanie/Obfuskacja kodu jest dość standardową praktyką.
|
||||
@@ -0,0 +1,31 @@
|
||||
Leia isso em outros idiomas: [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md)
|
||||
|
||||
# Segurança
|
||||
|
||||
### Are you tracking my viewing history?
|
||||
|
||||
No. The extension's code is public and you can see it for yourself. The only information being sent is the video ID, which is required to fetch the dislike count for the videos. There are no additional headers being sent. Over the communication layer, your public IP will be exposed to the server, as well as the time when the request was made. However, none of these are uniquely identifying you in any way. Assuming a zero-trust environment, the best we could get is a dynamic IP. Which, today is yours, tomorrow is your neighbor's. If you're really worried about your IP being traced, you probably already use a VPN.
|
||||
|
||||
### Can you uniquely identify me if I dislike?
|
||||
|
||||
Yes. When you dislike a video, we create a randomly generated unique ID for you that is not tied to your Google account. This is done to prevent botting. But there is no way to tie this random Id to you or your personal YouTube account.
|
||||
|
||||
### Quais as informações que você tem, exatamente?
|
||||
|
||||
Somente seu video ID. Não temos seus comentarios, seu nome de usuario, ou qualquer outro Not your comments, not your username, not who you've shared the video with, not any additional metadata. NADA. Apenas seu Video ID.
|
||||
|
||||
### How is my IP stored?
|
||||
|
||||
The backend keeps unhashed IP addresses in volatile memory (RAM) only. These addresses aren't stored on a hard drive, and therefore aren't logged. We hash the IP addresses, and that's stored instead. This is done to prevent database vandalism.
|
||||
|
||||
### I heard some discussion over OAuth, and access to my YouTube account!
|
||||
|
||||
This feature will be optional, and very much opt-in. If you are a YouTube creator, and would like to share your dislike stats with us, you can. The way [OAuth](https://en.wikipedia.org/wiki/OAuth#:~:text=but%20without%20giving%20them%20the%20passwords.) was structured, it's actually very secure. You can revoke access to your account at any time, and can give very specific permissions to us. We will not ask for any permissions that aren't required. We'll only ask for permissions to view your video stats.
|
||||
|
||||
### How can I trust this dislike count?
|
||||
|
||||
We have implemented measures to prevent bot attacks and are gonna continue to work on improving the effectiveness of the bot prevention system: this will help us keep the dislike count as a good representative of the actual count. Of course it will never be 100% accurate so it's up to you to decide whether you trust the count or not.
|
||||
|
||||
### Why don't you share the backend code?
|
||||
|
||||
We will share it at some point - but there's really no real reason to share it right now. It gives a false sense of security - because in a zero-trust system, we could just as well disclose one version but deploy another. There are plenty of reasons to keep the code hidden, specifically, how we battle spam. Hiding/Obfuscating the spam handling code is a fairly standard practice.
|
||||
@@ -1,4 +1,4 @@
|
||||
Прочитать на других языках: [English](SECURITY-FAQ.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md)
|
||||
Прочитать на других языках: [English](SECURITY-FAQ.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md)
|
||||
|
||||
# Безопасность
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [українська](SECURITY-FAQuk.md)
|
||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md)
|
||||
|
||||
# Güvenlik
|
||||
|
||||
|
||||
+31
-31
@@ -1,31 +1,31 @@
|
||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md)
|
||||
|
||||
# Безпека
|
||||
|
||||
### Ви відстежуєте мою історію переглядів?
|
||||
|
||||
Ні. Код розширення знаходиться у відкритому доступі, і ви можете ознайомитись з ним самостійно. Єдина інформація, що передається - це ID відео, який необхідний для отримання даних про кількість відміток. Жодних додаткових заголовків не передається. На комунікаційному рівні серверу буде передано вашу публічну IP-адресу, а також час, коли було зроблено запит. Однак ніщо з цього ніяк не здатно вас ідентифіквати. Припускаючи середовище з нульовою довірою, найцінніше, що ми можемо отримати це динамічний IP. Який сьогодні ваш, а завтра – вашого сусіда. Якщо ви дійсно турбуєтеся про те, що ваш IP може бути відстежений, ви, ймовірно, вже використовуєте якийсь VPN.
|
||||
|
||||
### Чи можете ви однозначно ідентифікувати мене, коли я залишаю відмітку «Не подобається»?
|
||||
|
||||
Так. Коли ви залишаєте відео позначку «Не подобається», ми створюємо для вас випадковий унікальний ID, який не прив'язаний до вашого облікового запису Google. Це робиться для уникнення атаки ботів. Але немає жодного способу зв'язати цей випадковий ID до вас або вашого особистого облікового запису YouTube.
|
||||
|
||||
### Якою саме інформацією ви володієте?
|
||||
|
||||
Лише ID відео. Ні ваших коментарів, ні вашого імені користувача, ні того, з ким ви поділилися відео, ні будь-яких інших додаткових метаданих. Нічого. Лише ID відео.
|
||||
|
||||
### Як зберігається моя IP-адреса?
|
||||
|
||||
Внутрішня частина нашого сервера зберігає нехешовані IP-адреси лише в енергозалежній пам'яті (ОЗП). Ці адреси не зберігаються на жорсткому диску і тому ніде не записані. Ми хешуємо IP-адреси, і вони зберігаються замість інших. Це зроблено для запобігання вандалізму у базі даних.
|
||||
|
||||
### Я чув дискусію щодо OAuth і доступу до мого облікового запису YouTube!
|
||||
|
||||
Ця функція буде необов'язковою та дуже необхідною. Якщо ви творець YouTube і хочете поділитися з нами кількістю ваших відміток «Не подобається», ви зможете це зробити. За структурою [OAuth](https://uk.wikipedia.org/wiki/OAuth#:~:text=%D0%B1%D0%B5%D0%B7%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D1%96%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%96%20%D0%B2%D0%B2%D0%BE%D0%B4%D1%83%20%D1%96%D0%BC%D0%B5%D0%BD%D1%96%20%D0%BA%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87%D0%B0%20%D1%82%D0%B0%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8E) надбезпечний. Ви зможете відкликати доступ до свого облікового запису в будь-яку мить, і зможете дати нам обмежені дозволи. Ми не будемо вимагати жодних дозволів, крім необжідних. Ми будемо вимагати лише дозволи перегляду статистики ваших відео.
|
||||
|
||||
### Наскільки достовірна ця кількость відміток «Не подобається»?
|
||||
|
||||
Ми вжили заходів щодо запобігання атакам ботів і збираємося продовжувати працювати над підвищенням ефективності цієї сисеми надалі: це допоможе нам зберегти підрахунок відміток «Не подобається» як хороше представлення фактичної кількості. Звичайно, він ніколи не буде точним на всі 100%, тож ви самі вирішуєте, довіряти йому чи ні.
|
||||
|
||||
### Чому б вам не поділитися внутрішнім кодом вашого сервера?
|
||||
|
||||
Ми поділимося ним у якийсь момент – але зараз немає жодних причин це робити. Це дасть хибне почуття безпеки - адже в системі з нульовою довірою ми можемо з таким самим успіхом поділитися однією версією, але розгорнути іншу. Є багато причин тримати код у таємниці, зокрема, як ми боремося зі спамом. Приховування та затьмарення коду обробки спаму є доволі стандартною практикою.
|
||||
Read this in other languages: [English](SECURITY-FAQ.md), [русский](SECURITY-FAQru.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md)
|
||||
|
||||
# Безпека
|
||||
|
||||
### Ви відстежуєте мою історію переглядів?
|
||||
|
||||
Ні. Код розширення знаходиться у відкритому доступі, і ви можете ознайомитись з ним самостійно. Єдина інформація, що передається - це ID відео, який необхідний для отримання даних про кількість відміток. Жодних додаткових заголовків не передається. На комунікаційному рівні серверу буде передано вашу публічну IP-адресу, а також час, коли було зроблено запит. Однак ніщо з цього ніяк не здатно вас ідентифіквати. Припускаючи середовище з нульовою довірою, найцінніше, що ми можемо отримати це динамічний IP. Який сьогодні ваш, а завтра – вашого сусіда. Якщо ви дійсно турбуєтеся про те, що ваш IP може бути відстежений, ви, ймовірно, вже використовуєте якийсь VPN.
|
||||
|
||||
### Чи можете ви однозначно ідентифікувати мене, коли я залишаю відмітку «Не подобається»?
|
||||
|
||||
Так. Коли ви залишаєте відео позначку «Не подобається», ми створюємо для вас випадковий унікальний ID, який не прив'язаний до вашого облікового запису Google. Це робиться для уникнення атаки ботів. Але немає жодного способу зв'язати цей випадковий ID до вас або вашого особистого облікового запису YouTube.
|
||||
|
||||
### Якою саме інформацією ви володієте?
|
||||
|
||||
Лише ID відео. Ні ваших коментарів, ні вашого імені користувача, ні того, з ким ви поділилися відео, ні будь-яких інших додаткових метаданих. Нічого. Лише ID відео.
|
||||
|
||||
### Як зберігається моя IP-адреса?
|
||||
|
||||
Внутрішня частина нашого сервера зберігає нехешовані IP-адреси лише в енергозалежній пам'яті (ОЗП). Ці адреси не зберігаються на жорсткому диску і тому ніде не записані. Ми хешуємо IP-адреси, і вони зберігаються замість інших. Це зроблено для запобігання вандалізму у базі даних.
|
||||
|
||||
### Я чув дискусію щодо OAuth і доступу до мого облікового запису YouTube!
|
||||
|
||||
Ця функція буде необов'язковою та дуже необхідною. Якщо ви творець YouTube і хочете поділитися з нами кількістю ваших відміток «Не подобається», ви зможете це зробити. За структурою [OAuth](https://uk.wikipedia.org/wiki/OAuth#:~:text=%D0%B1%D0%B5%D0%B7%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D1%96%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%96%20%D0%B2%D0%B2%D0%BE%D0%B4%D1%83%20%D1%96%D0%BC%D0%B5%D0%BD%D1%96%20%D0%BA%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87%D0%B0%20%D1%82%D0%B0%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8E) надбезпечний. Ви зможете відкликати доступ до свого облікового запису в будь-яку мить, і зможете дати нам обмежені дозволи. Ми не будемо вимагати жодних дозволів, крім необжідних. Ми будемо вимагати лише дозволи перегляду статистики ваших відео.
|
||||
|
||||
### Наскільки достовірна ця кількость відміток «Не подобається»?
|
||||
|
||||
Ми вжили заходів щодо запобігання атакам ботів і збираємося продовжувати працювати над підвищенням ефективності цієї сисеми надалі: це допоможе нам зберегти підрахунок відміток «Не подобається» як хороше представлення фактичної кількості. Звичайно, він ніколи не буде точним на всі 100%, тож ви самі вирішуєте, довіряти йому чи ні.
|
||||
|
||||
### Чому б вам не поділитися внутрішнім кодом вашого сервера?
|
||||
|
||||
Ми поділимося ним у якийсь момент – але зараз немає жодних причин це робити. Це дасть хибне почуття безпеки - адже в системі з нульовою довірою ми можемо з таким самим успіхом поділитися однією версією, але розгорнути іншу. Є багато причин тримати код у таємниці, зокрема, як ми боремося зі спамом. Приховування та затьмарення коду обробки спаму є доволі стандартною практикою.
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [Nederlands](readmenl.md), [Français](readmefr.md), [Türkçe](READMEtr.md)
|
||||
Read this in other languages: [Nederlands](readmenl.md), [Français](readmefr.md), [Türkçe](readmetr.md)
|
||||
|
||||
**Contents**
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Lisez ceci dans d'autres langues : [English](readme.md), [Nederlands](readmenl.md), [Türkçe](READMEtr.md)
|
||||
Lisez ceci dans d'autres langues : [English](readme.md), [Nederlands](readmenl.md), [Türkçe](readmetr.md)
|
||||
|
||||
**Contenu**
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [English](readme.md), [Français](readmefr.md), [Türkçe](READMEtr.md)
|
||||
Read this in other languages: [English](readme.md), [Français](readmefr.md), [Türkçe](readmetr.md)
|
||||
|
||||
**Inhoud**
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
Leia isso em outros idiomas: [Nederlands](readmenl.md), [Français](readmefr.md), [Türkçe](readmetr.md)
|
||||
|
||||
**Contents**
|
||||
|
||||
- [Guides](#guides)
|
||||
- [FAQs](#faqs)
|
||||
<!-- - [FAQs](#faqs)
|
||||
- [Other Lists](#other-lists) -->
|
||||
|
||||
<br>
|
||||
|
||||
## Guides
|
||||
|
||||
- [Downloading, Installing & Using](https://github.com/Anarios/return-youtube-dislike/wiki/Downloading,-Installing-&-Using)
|
||||
- [Troubleshooting](https://github.com/Anarios/return-youtube-dislike/wiki/Troubleshooting-Guide)
|
||||
<!-- - [FAQ](FAQ.md)
|
||||
- [When & How to Report Bugs](Guide__Bug_Reporting.md)
|
||||
- [Contributing](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md) -->
|
||||
<!-- - [How to update wiki](/) -->
|
||||
|
||||
<br>
|
||||
|
||||
## FAQs
|
||||
|
||||
- [General](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
- [Security](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md)
|
||||
|
||||
<!-- - [Privacy](FAQ_Privacy.md)
|
||||
- [Technical](FAQ_Technical.md)
|
||||
- [Creators](FAQ_Creators.md)
|
||||
|
||||
<br>
|
||||
|
||||
## Other Lists
|
||||
|
||||
- [Common Problems](Common_Problems.md)
|
||||
- [Repeated Questions](Repeated_Questions.md)
|
||||
- [Repeated Feature requests](Repeated_Feature_requests.md)
|
||||
- [Repeated Issues](Repeated_Issues.md) -->
|
||||
@@ -2,7 +2,7 @@
|
||||
// @name Return YouTube Dislike
|
||||
// @namespace https://www.returnyoutubedislike.com/
|
||||
// @homepage https://www.returnyoutubedislike.com/
|
||||
// @version 3.1.2
|
||||
// @version 3.1.5
|
||||
// @encoding utf-8
|
||||
// @description Return of the YouTube Dislike, Based off https://www.returnyoutubedislike.com/
|
||||
// @icon https://github.com/Anarios/return-youtube-dislike/raw/main/Icons/Return%20Youtube%20Dislike%20-%20Transparent.png
|
||||
@@ -28,6 +28,7 @@ const extConfig = {
|
||||
// You may change the following variables to allowed values listed in the corresponding brackets (* means default). Keep the style and keywords intact.
|
||||
showUpdatePopup: false, // [true, false*] Show a popup tab after extension update (See what's new)
|
||||
disableVoteSubmission: false, // [true, false*] Disable like/dislike submission (Stops counting your likes and dislikes)
|
||||
disableLogging: true, // [true*, false] Disable Logging API Response in JavaScript Console.
|
||||
coloredThumbs: false, // [true, false*] Colorize thumbs (Use custom colors for thumb icons)
|
||||
coloredBar: false, // [true, false*] Colorize ratio bar (Use custom colors for ratio bar)
|
||||
colorTheme: "classic", // [classic*, accessible, neon] Color theme (red/green, blue/yellow, pink/cyan)
|
||||
@@ -35,6 +36,7 @@ const extConfig = {
|
||||
numberDisplayRoundDown: true, // [true*, false] Round down numbers (Show rounded down numbers)
|
||||
tooltipPercentageMode: "none", // [none*, dash_like, dash_dislike, both, only_like, only_dislike] Mode of showing percentage in like/dislike bar tooltip.
|
||||
numberDisplayReformatLikes: false, // [true, false*] Re-format like numbers (Make likes and dislikes format consistent)
|
||||
rateBarEnabled: false, // [true, false*] Enables ratio bar under like/dislike buttons
|
||||
// END USER OPTIONS
|
||||
};
|
||||
|
||||
@@ -44,13 +46,16 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
|
||||
let previousState = 3; //1=LIKED, 2=DISLIKED, 3=NEUTRAL
|
||||
let likesvalue = 0;
|
||||
let dislikesvalue = 0;
|
||||
let preNavigateLikeButton = null;
|
||||
|
||||
let isMobile = location.hostname == "m.youtube.com";
|
||||
let isShorts = () => location.pathname.startsWith("/shorts");
|
||||
let mobileDislikes = 0;
|
||||
function cLog(text, subtext = "") {
|
||||
subtext = subtext.trim() === "" ? "" : `(${subtext})`;
|
||||
console.log(`[Return YouTube Dislikes] ${text} ${subtext}`);
|
||||
if (!extConfig.disableLogging) {
|
||||
subtext = subtext.trim() === "" ? "" : `(${subtext})`;
|
||||
console.log(`[Return YouTube Dislikes] ${text} ${subtext}`);
|
||||
}
|
||||
}
|
||||
|
||||
function isInViewport(element) {
|
||||
@@ -71,9 +76,7 @@ function isInViewport(element) {
|
||||
function getButtons() {
|
||||
if (isShorts()) {
|
||||
let elements = document.querySelectorAll(
|
||||
isMobile
|
||||
? "ytm-like-button-renderer"
|
||||
: "#like-button > ytd-like-button-renderer"
|
||||
isMobile ? "ytm-like-button-renderer" : "#like-button > ytd-like-button-renderer",
|
||||
);
|
||||
for (let element of elements) {
|
||||
if (isInViewport(element)) {
|
||||
@@ -93,24 +96,34 @@ function getButtons() {
|
||||
document.querySelector("ytd-menu-renderer.ytd-video-primary-info-renderer > div")
|
||||
);
|
||||
} else {
|
||||
return document
|
||||
.getElementById("menu-container")
|
||||
?.querySelector("#top-level-buttons-computed");
|
||||
return document.getElementById("menu-container")?.querySelector("#top-level-buttons-computed");
|
||||
}
|
||||
}
|
||||
|
||||
function getDislikeButton() {
|
||||
return getButtons().children[0].tagName ===
|
||||
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||
? getButtons().children[0].children[1] === undefined ? document.querySelector("#segmented-dislike-button") : getButtons().children[0].children[1]
|
||||
: getButtons().children[1];
|
||||
if (getButtons().children[0].tagName === "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER") {
|
||||
if (getButtons().children[0].children[1] === undefined) {
|
||||
return document.querySelector("#segmented-dislike-button");
|
||||
} else {
|
||||
return getButtons().children[0].children[1];
|
||||
}
|
||||
} else {
|
||||
if (getButtons().querySelector("segmented-like-dislike-button-view-model")) {
|
||||
const dislikeViewModel = getButtons().querySelector("dislike-button-view-model");
|
||||
if (!dislikeViewModel) cLog("Dislike button wasn't added to DOM yet...");
|
||||
return dislikeViewModel;
|
||||
} else {
|
||||
return getButtons().children[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getLikeButton() {
|
||||
return getButtons().children[0].tagName ===
|
||||
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||
? document.querySelector("#segmented-like-button") !== null ? document.querySelector("#segmented-like-button") : getButtons().children[0].children[0]
|
||||
: getButtons().children[0];
|
||||
return getButtons().children[0].tagName === "YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||
? document.querySelector("#segmented-like-button") !== null
|
||||
? document.querySelector("#segmented-like-button")
|
||||
: getButtons().children[0].children[0]
|
||||
: getButtons().querySelector("like-button-view-model") ?? getButtons().children[0];
|
||||
}
|
||||
|
||||
function getLikeTextContainer() {
|
||||
@@ -121,79 +134,80 @@ function getLikeTextContainer() {
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
function getDislikeTextContainer() {
|
||||
const dislikeButton = getDislikeButton();
|
||||
let result =
|
||||
getDislikeButton().querySelector("#text") ??
|
||||
getDislikeButton().getElementsByTagName("yt-formatted-string")[0] ??
|
||||
getDislikeButton().querySelector("span[role='text']")
|
||||
dislikeButton?.querySelector("#text") ??
|
||||
dislikeButton?.getElementsByTagName("yt-formatted-string")[0] ??
|
||||
dislikeButton?.querySelector("span[role='text']");
|
||||
if (result === null) {
|
||||
let textSpan = document.createElement("span");
|
||||
textSpan.id = "text";
|
||||
textSpan.style.marginLeft = "6px";
|
||||
getDislikeButton().querySelector("button").appendChild(textSpan);
|
||||
getDislikeButton().querySelector("button").style.width = "auto";
|
||||
result = getDislikeButton().querySelector("#text");
|
||||
dislikeButton?.querySelector("button").appendChild(textSpan);
|
||||
if (dislikeButton) dislikeButton.querySelector("button").style.width = "auto";
|
||||
result = textSpan;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
let mutationObserver = new Object();
|
||||
|
||||
if (isShorts() && mutationObserver.exists !== true) {
|
||||
cLog("initializing mutation observer");
|
||||
mutationObserver.options = {
|
||||
childList: false,
|
||||
attributes: true,
|
||||
subtree: false,
|
||||
function createObserver(options, callback) {
|
||||
const observerWrapper = new Object();
|
||||
observerWrapper.options = options;
|
||||
observerWrapper.observer = new MutationObserver(callback);
|
||||
observerWrapper.observe = function (element) {
|
||||
this.observer.observe(element, this.options);
|
||||
};
|
||||
mutationObserver.exists = true;
|
||||
mutationObserver.observer = new MutationObserver(function (
|
||||
mutationList,
|
||||
observer
|
||||
) {
|
||||
mutationList.forEach((mutation) => {
|
||||
if (
|
||||
mutation.type === "attributes" &&
|
||||
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
||||
mutation.target.id === "button"
|
||||
) {
|
||||
cLog("Short thumb button status changed");
|
||||
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
||||
mutation.target.style.color =
|
||||
mutation.target.parentElement.parentElement.id === "like-button"
|
||||
? getColorFromTheme(true)
|
||||
: getColorFromTheme(false);
|
||||
} else {
|
||||
mutation.target.style.color = "unset";
|
||||
observerWrapper.disconnect = function () {
|
||||
this.observer.disconnect();
|
||||
};
|
||||
return observerWrapper;
|
||||
}
|
||||
|
||||
let shortsObserver = null;
|
||||
|
||||
if (isShorts() && !shortsObserver) {
|
||||
cLog("Initializing shorts mutation observer");
|
||||
shortsObserver = createObserver(
|
||||
{
|
||||
attributes: true,
|
||||
},
|
||||
(mutationList) => {
|
||||
mutationList.forEach((mutation) => {
|
||||
if (
|
||||
mutation.type === "attributes" &&
|
||||
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
||||
mutation.target.id === "button"
|
||||
) {
|
||||
cLog("Short thumb button status changed");
|
||||
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
||||
mutation.target.style.color =
|
||||
mutation.target.parentElement.parentElement.id === "like-button"
|
||||
? getColorFromTheme(true)
|
||||
: getColorFromTheme(false);
|
||||
} else {
|
||||
mutation.target.style.color = "unset";
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
cLog(
|
||||
"unexpected mutation observer event: " + mutation.target + mutation.type
|
||||
);
|
||||
});
|
||||
});
|
||||
cLog("Unexpected mutation observer event: " + mutation.target + mutation.type);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
function isVideoLiked() {
|
||||
if (isMobile) {
|
||||
return (
|
||||
getLikeButton().querySelector("button").getAttribute("aria-label") ==
|
||||
"true"
|
||||
);
|
||||
return getLikeButton().querySelector("button").getAttribute("aria-label") == "true";
|
||||
}
|
||||
return getLikeButton().classList.contains("style-default-active");
|
||||
}
|
||||
|
||||
function isVideoDisliked() {
|
||||
if (isMobile) {
|
||||
return (
|
||||
getDislikeButton().querySelector("button").getAttribute("aria-label") ==
|
||||
"true"
|
||||
);
|
||||
return getDislikeButton()?.querySelector("button").getAttribute("aria-label") == "true";
|
||||
}
|
||||
return getDislikeButton().classList.contains("style-default-active");
|
||||
return getDislikeButton()?.classList.contains("style-default-active");
|
||||
}
|
||||
|
||||
function isVideoNotLiked() {
|
||||
@@ -207,7 +221,7 @@ function isVideoNotDisliked() {
|
||||
if (isMobile) {
|
||||
return !isVideoDisliked();
|
||||
}
|
||||
return getDislikeButton().classList.contains("style-text");
|
||||
return getDislikeButton()?.classList.contains("style-text");
|
||||
}
|
||||
|
||||
function checkForUserAvatarButton() {
|
||||
@@ -233,8 +247,7 @@ function getState() {
|
||||
|
||||
function setLikes(likesCount) {
|
||||
if (isMobile) {
|
||||
getButtons().children[0].querySelector(".button-renderer-text").innerText =
|
||||
likesCount;
|
||||
getButtons().children[0].querySelector(".button-renderer-text").innerText = likesCount;
|
||||
return;
|
||||
}
|
||||
getLikeTextContainer().innerText = likesCount;
|
||||
@@ -245,8 +258,12 @@ function setDislikes(dislikesCount) {
|
||||
mobileDislikes = dislikesCount;
|
||||
return;
|
||||
}
|
||||
getDislikeTextContainer()?.removeAttribute('is-empty');
|
||||
getDislikeTextContainer().innerText = dislikesCount;
|
||||
|
||||
const _container = getDislikeTextContainer();
|
||||
_container?.removeAttribute("is-empty");
|
||||
if (_container?.innerText !== dislikesCount) {
|
||||
_container.innerText = dislikesCount;
|
||||
}
|
||||
}
|
||||
|
||||
function getLikeCountFromButton() {
|
||||
@@ -256,18 +273,14 @@ function getLikeCountFromButton() {
|
||||
//It should be possible to fix this function, but it's not critical to showing the dislike count.
|
||||
return false;
|
||||
}
|
||||
let likeButton = getLikeButton()
|
||||
.querySelector("yt-formatted-string#text") ??
|
||||
getLikeButton().querySelector("button");
|
||||
let likeButton =
|
||||
getLikeButton().querySelector("yt-formatted-string#text") ?? getLikeButton().querySelector("button");
|
||||
|
||||
let likesStr = likeButton.getAttribute("aria-label")
|
||||
.replace(/\D/g, "");
|
||||
let likesStr = likeButton.getAttribute("aria-label").replace(/\D/g, "");
|
||||
return likesStr.length > 0 ? parseInt(likesStr) : false;
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
(typeof GM_addStyle != "undefined"
|
||||
@@ -290,10 +303,10 @@ function getLikeCountFromButton() {
|
||||
}
|
||||
|
||||
.ryd-tooltip {
|
||||
position: relative;
|
||||
position: absolute;
|
||||
display: block;
|
||||
height: 2px;
|
||||
top: 9px;
|
||||
bottom: -10px;
|
||||
}
|
||||
|
||||
.ryd-tooltip-bar-container {
|
||||
@@ -301,24 +314,28 @@ function getLikeCountFromButton() {
|
||||
height: 2px;
|
||||
position: absolute;
|
||||
padding-top: 6px;
|
||||
padding-bottom: 28px;
|
||||
padding-bottom: 12px;
|
||||
top: -6px;
|
||||
}
|
||||
|
||||
ytd-menu-renderer.ytd-watch-metadata {
|
||||
overflow-y: visible !important;
|
||||
}
|
||||
|
||||
#top-level-buttons-computed {
|
||||
position: relative !important;
|
||||
}
|
||||
`);
|
||||
|
||||
function createRateBar(likes, dislikes) {
|
||||
if (isMobile) {
|
||||
if (isMobile || !extConfig.rateBarEnabled) {
|
||||
return;
|
||||
}
|
||||
let rateBar = document.getElementById("return-youtube-dislike-bar-container");
|
||||
|
||||
const widthPx =
|
||||
getButtons().children[0].clientWidth +
|
||||
getButtons().children[1].clientWidth +
|
||||
8;
|
||||
const widthPx = getLikeButton().clientWidth + (getDislikeButton()?.clientWidth ?? 52);
|
||||
|
||||
const widthPercent =
|
||||
likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
|
||||
const widthPercent = likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
|
||||
|
||||
var likePercentage = parseFloat(widthPercent.toFixed(1));
|
||||
const dislikePercentage = (100 - likePercentage).toLocaleString();
|
||||
@@ -353,7 +370,7 @@ function createRateBar(likes, dislikes) {
|
||||
colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
|
||||
}
|
||||
|
||||
document.getElementById("menu-container").insertAdjacentHTML(
|
||||
getButtons().insertAdjacentHTML(
|
||||
"beforeend",
|
||||
`
|
||||
<div class="ryd-tooltip" style="width: ${widthPx}px">
|
||||
@@ -372,25 +389,18 @@ function createRateBar(likes, dislikes) {
|
||||
<!--css-build:shady-->${tooltipInnerHTML}
|
||||
</tp-yt-paper-tooltip>
|
||||
</div>
|
||||
`
|
||||
`,
|
||||
);
|
||||
let descriptionAndActionsElement = document.getElementById("top-row");
|
||||
descriptionAndActionsElement.style.borderBottom = "1px solid var(--yt-spec-10-percent-layer)";
|
||||
descriptionAndActionsElement.style.paddingBottom = "10px";
|
||||
} else {
|
||||
document.getElementById(
|
||||
"return-youtube-dislike-bar-container"
|
||||
).style.width = widthPx + "px";
|
||||
document.getElementById("return-youtube-dislike-bar").style.width =
|
||||
widthPercent + "%";
|
||||
|
||||
document.querySelector("#ryd-dislike-tooltip > #tooltip").innerHTML =
|
||||
tooltipInnerHTML;
|
||||
document.querySelector(".ryd-tooltip").style.width = widthPx + "px";
|
||||
document.getElementById("return-youtube-dislike-bar").style.width = widthPercent + "%";
|
||||
|
||||
if (extConfig.coloredBar) {
|
||||
document.getElementById(
|
||||
"return-youtube-dislike-bar-container"
|
||||
).style.backgroundColor = getColorFromTheme(false);
|
||||
document.getElementById(
|
||||
"return-youtube-dislike-bar"
|
||||
).style.backgroundColor = getColorFromTheme(true);
|
||||
document.getElementById("return-youtube-dislike-bar-container").style.backgroundColor = getColorFromTheme(false);
|
||||
document.getElementById("return-youtube-dislike-bar").style.backgroundColor = getColorFromTheme(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -399,9 +409,7 @@ function setState() {
|
||||
cLog("Fetching votes...");
|
||||
let statsSet = false;
|
||||
|
||||
fetch(
|
||||
`https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}`
|
||||
).then((response) => {
|
||||
fetch(`https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}`).then((response) => {
|
||||
response.json().then((json) => {
|
||||
if (json && !("traceId" in response) && !statsSet) {
|
||||
const { dislikes, likes } = json;
|
||||
@@ -417,31 +425,22 @@ function setState() {
|
||||
}
|
||||
createRateBar(likes, dislikes);
|
||||
if (extConfig.coloredThumbs === true) {
|
||||
const dislikeButton = getDislikeButton();
|
||||
if (isShorts()) {
|
||||
// for shorts, leave deactived buttons in default color
|
||||
let shortLikeButton = getLikeButton().querySelector(
|
||||
"tp-yt-paper-button#button"
|
||||
);
|
||||
let shortDislikeButton = getDislikeButton().querySelector(
|
||||
"tp-yt-paper-button#button"
|
||||
);
|
||||
const shortLikeButton = getLikeButton().querySelector("tp-yt-paper-button#button");
|
||||
const shortDislikeButton = dislikeButton?.querySelector("tp-yt-paper-button#button");
|
||||
if (shortLikeButton.getAttribute("aria-pressed") === "true") {
|
||||
shortLikeButton.style.color = getColorFromTheme(true);
|
||||
}
|
||||
if (shortDislikeButton.getAttribute("aria-pressed") === "true") {
|
||||
if (shortDislikeButton && shortDislikeButton.getAttribute("aria-pressed") === "true") {
|
||||
shortDislikeButton.style.color = getColorFromTheme(false);
|
||||
}
|
||||
mutationObserver.observer.observe(
|
||||
shortLikeButton,
|
||||
mutationObserver.options
|
||||
);
|
||||
mutationObserver.observer.observe(
|
||||
shortDislikeButton,
|
||||
mutationObserver.options
|
||||
);
|
||||
shortsObserver.observe(shortLikeButton);
|
||||
shortsObserver.observe(shortDislikeButton);
|
||||
} else {
|
||||
getLikeButton().style.color = getColorFromTheme(true);
|
||||
getDislikeButton().style.color = getColorFromTheme(false);
|
||||
if (dislikeButton) dislikeButton.style.color = getColorFromTheme(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -449,22 +448,25 @@ function setState() {
|
||||
});
|
||||
}
|
||||
|
||||
function updateDOMDislikes() {
|
||||
setDislikes(numberFormat(dislikesvalue));
|
||||
createRateBar(likesvalue, dislikesvalue);
|
||||
}
|
||||
|
||||
function likeClicked() {
|
||||
if (checkForUserAvatarButton() == true) {
|
||||
if (previousState == 1) {
|
||||
likesvalue--;
|
||||
createRateBar(likesvalue, dislikesvalue);
|
||||
setDislikes(numberFormat(dislikesvalue));
|
||||
updateDOMDislikes();
|
||||
previousState = 3;
|
||||
} else if (previousState == 2) {
|
||||
likesvalue++;
|
||||
dislikesvalue--;
|
||||
setDislikes(numberFormat(dislikesvalue));
|
||||
createRateBar(likesvalue, dislikesvalue);
|
||||
updateDOMDislikes();
|
||||
previousState = 1;
|
||||
} else if (previousState == 3) {
|
||||
likesvalue++;
|
||||
createRateBar(likesvalue, dislikesvalue);
|
||||
updateDOMDislikes();
|
||||
previousState = 1;
|
||||
}
|
||||
if (extConfig.numberDisplayReformatLikes === true) {
|
||||
@@ -480,19 +482,16 @@ function dislikeClicked() {
|
||||
if (checkForUserAvatarButton() == true) {
|
||||
if (previousState == 3) {
|
||||
dislikesvalue++;
|
||||
setDislikes(numberFormat(dislikesvalue));
|
||||
createRateBar(likesvalue, dislikesvalue);
|
||||
updateDOMDislikes();
|
||||
previousState = 2;
|
||||
} else if (previousState == 2) {
|
||||
dislikesvalue--;
|
||||
setDislikes(numberFormat(dislikesvalue));
|
||||
createRateBar(likesvalue, dislikesvalue);
|
||||
updateDOMDislikes();
|
||||
previousState = 3;
|
||||
} else if (previousState == 1) {
|
||||
likesvalue--;
|
||||
dislikesvalue++;
|
||||
setDislikes(numberFormat(dislikesvalue));
|
||||
createRateBar(likesvalue, dislikesvalue);
|
||||
updateDOMDislikes();
|
||||
previousState = 2;
|
||||
if (extConfig.numberDisplayReformatLikes === true) {
|
||||
const nativeLikes = getLikeCountFromButton();
|
||||
@@ -512,7 +511,7 @@ function getVideoId() {
|
||||
const urlObject = new URL(window.location.href);
|
||||
const pathname = urlObject.pathname;
|
||||
if (pathname.startsWith("/clip")) {
|
||||
return document.querySelector("meta[itemprop='videoId']").content;
|
||||
return (document.querySelector("meta[itemprop='videoId']") || document.querySelector("meta[itemprop='identifier']")).content;
|
||||
} else {
|
||||
if (pathname.startsWith("/shorts")) {
|
||||
return pathname.slice(8);
|
||||
@@ -528,7 +527,12 @@ function isVideoLoaded() {
|
||||
const videoId = getVideoId();
|
||||
|
||||
return (
|
||||
document.querySelector(`ytd-watch-flexy[video-id='${videoId}']`) !== null
|
||||
// desktop: spring 2024 UI
|
||||
document.querySelector(`ytd-watch-grid[video-id='${videoId}']`) !== null ||
|
||||
// desktop: older UI
|
||||
document.querySelector(`ytd-watch-flexy[video-id='${videoId}']`) !== null ||
|
||||
// mobile: no video-id attribute
|
||||
document.querySelector('#player[loading="false"]:not([hidden])') !== null
|
||||
);
|
||||
}
|
||||
|
||||
@@ -547,9 +551,7 @@ function numberFormat(numberState) {
|
||||
} else {
|
||||
numberDisplay = roundDown(numberState);
|
||||
}
|
||||
return getNumberFormatter(extConfig.numberDisplayFormat).format(
|
||||
numberDisplay
|
||||
);
|
||||
return getNumberFormatter(extConfig.numberDisplayFormat).format(numberDisplay);
|
||||
}
|
||||
|
||||
function getNumberFormatter(optionSelect) {
|
||||
@@ -563,12 +565,10 @@ function getNumberFormatter(optionSelect) {
|
||||
userLocales = new URL(
|
||||
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
||||
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
||||
?.getAttribute("href")
|
||||
?.getAttribute("href"),
|
||||
)?.searchParams?.get("locale");
|
||||
} catch {
|
||||
cLog(
|
||||
"Cannot find browser locale. Use en as default for number formatting."
|
||||
);
|
||||
cLog("Cannot find browser locale. Use en as default for number formatting.");
|
||||
userLocales = "en";
|
||||
}
|
||||
}
|
||||
@@ -625,6 +625,8 @@ function getColorFromTheme(voteIsLike) {
|
||||
return colorString;
|
||||
}
|
||||
|
||||
let smartimationObserver = null;
|
||||
|
||||
function setEventListeners(evt) {
|
||||
let jsInitChecktimer;
|
||||
|
||||
@@ -632,21 +634,46 @@ function setEventListeners(evt) {
|
||||
//console.log();
|
||||
if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) {
|
||||
const buttons = getButtons();
|
||||
const dislikeButton = getDislikeButton();
|
||||
|
||||
if (!window.returnDislikeButtonlistenersSet) {
|
||||
if (preNavigateLikeButton !== getLikeButton() && dislikeButton) {
|
||||
cLog("Registering button listeners...");
|
||||
try {
|
||||
getLikeButton().addEventListener("click", likeClicked);
|
||||
getDislikeButton().addEventListener("click", dislikeClicked);
|
||||
dislikeButton?.addEventListener("click", dislikeClicked);
|
||||
getLikeButton().addEventListener("touchstart", likeClicked);
|
||||
getDislikeButton().addEventListener("touchstart", dislikeClicked);
|
||||
dislikeButton?.addEventListener("touchstart", dislikeClicked);
|
||||
dislikeButton?.addEventListener("focusin", updateDOMDislikes);
|
||||
dislikeButton?.addEventListener("focusout", updateDOMDislikes);
|
||||
preNavigateLikeButton = getLikeButton();
|
||||
|
||||
if (!smartimationObserver) {
|
||||
smartimationObserver = createObserver(
|
||||
{
|
||||
attributes: true,
|
||||
subtree: true,
|
||||
childList: true,
|
||||
},
|
||||
updateDOMDislikes,
|
||||
);
|
||||
smartimationObserver.container = null;
|
||||
}
|
||||
|
||||
const smartimationContainer = buttons.querySelector("yt-smartimation");
|
||||
if (smartimationContainer && smartimationObserver.container != smartimationContainer) {
|
||||
cLog("Initializing smartimation mutation observer");
|
||||
smartimationObserver.disconnect();
|
||||
smartimationObserver.observe(smartimationContainer);
|
||||
smartimationObserver.container = smartimationContainer;
|
||||
}
|
||||
} catch {
|
||||
return;
|
||||
} //Don't spam errors into the console
|
||||
window.returnDislikeButtonlistenersSet = true;
|
||||
}
|
||||
setInitialState();
|
||||
clearInterval(jsInitChecktimer);
|
||||
if (dislikeButton) {
|
||||
setInitialState();
|
||||
clearInterval(jsInitChecktimer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -667,12 +694,11 @@ if (isMobile) {
|
||||
return originalPush.apply(history, args);
|
||||
};
|
||||
setInterval(() => {
|
||||
if(getDislikeButton().querySelector(".button-renderer-text") === null){
|
||||
const dislikeButton = getDislikeButton();
|
||||
if (dislikeButton?.querySelector(".button-renderer-text") === null) {
|
||||
getDislikeTextContainer().innerText = mobileDislikes;
|
||||
}
|
||||
else{
|
||||
getDislikeButton().querySelector(".button-renderer-text").innerText =
|
||||
mobileDislikes;
|
||||
} else {
|
||||
if (dislikeButton) dislikeButton.querySelector(".button-renderer-text").innerText = mobileDislikes;
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"message": "aktualizovat na"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Verze 3.0.0.9 nainstalována"
|
||||
"message": "Verze __RYD_VERSION__ nainstalována"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Co je nového"
|
||||
|
||||
@@ -23,20 +23,68 @@
|
||||
"linkHelp": {
|
||||
"message": "Hilfe"
|
||||
},
|
||||
"linkChangelog": {
|
||||
"message": "Änderungshistorie"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "Einstellungen"
|
||||
},
|
||||
"textSettings": {
|
||||
"message": "Deaktiviere Like/Dislike-Übermittlung"
|
||||
},
|
||||
"textLikesDisabled": {
|
||||
"message": "Deaktiviert vom Ersteller"
|
||||
},
|
||||
"textSettingsHover": {
|
||||
"message": "Stoppt deine Likes und Dislikes zu zählen."
|
||||
},
|
||||
"textRoundingNumbers": {
|
||||
"message": "Runde Likes/Dislikes ab (Standardverhalten von YouTube)"
|
||||
},
|
||||
"textRoundingNumbersHover": {
|
||||
"message": "Zeige abgerundete Zahlen."
|
||||
},
|
||||
"textConsistentFormat": {
|
||||
"message": "Mach das Format der Likes und Dislikes einheitlich."
|
||||
},
|
||||
"textConsistentFormatHover": {
|
||||
"message": "Wie Zahlen neu formatieren"
|
||||
},
|
||||
"textNumberFormat": {
|
||||
"message": "Zahlenformat:"
|
||||
},
|
||||
"textColorizeRatioBar": {
|
||||
"message": "Verhältnisbalken einfärben"
|
||||
},
|
||||
"textColorizeRatioBarHover": {
|
||||
"message": "Benutzerdefinierte Farben für die Verhältnisleiste verwenden."
|
||||
},
|
||||
"textColorizeThumbs": {
|
||||
"message": "Färbe Daumen-Icons"
|
||||
},
|
||||
"textColorizeThumbsHover": {
|
||||
"message": "Nutze benutzerdefinierte Farben für die Daumen-Icons."
|
||||
},
|
||||
"textColorTheme": {
|
||||
"message": "Farbschema:"
|
||||
},
|
||||
"textColorTheme1": {
|
||||
"message": "Klassisch"
|
||||
},
|
||||
"textColorTheme2": {
|
||||
"message": "Zugänglich"
|
||||
},
|
||||
"textColorTheme3": {
|
||||
"message": "Neon"
|
||||
},
|
||||
"textTempUnavailable": {
|
||||
"message": "Temporär nicht erreichbar"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "aktualisieren auf"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Version 3.0.0.9 installiert"
|
||||
"message": "Version __RYD_VERSION__ installiert"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Was ist neu"
|
||||
@@ -63,7 +111,7 @@
|
||||
"message": "Wie Zahlen neu formatieren"
|
||||
},
|
||||
"reformatLikesHover": {
|
||||
"message": "Machen Sie das Format der Vorlieben und Abneigungen konsistent."
|
||||
"message": "Mach das Format der Likes und Dislikes einheitlich."
|
||||
},
|
||||
"numberFormat": {
|
||||
"message": "Zahlenformat:"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"extensionName": {
|
||||
"message": "Επιστροφή του YouTube Dislike"
|
||||
"message": "Επαναφορά του YouTube Dislike"
|
||||
},
|
||||
"extensionNameBeta": {
|
||||
"message": "Return YouTube Dislike Beta"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "Επιστρέφει τα dislikes"
|
||||
"message": "Επαναφέρει τη δυνατότητα να βλέπετε τα dislikes"
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "από τον Dmitry Selivanov & την κοινότητα"
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "Ενημέρωση σε"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Εκδοση 3.0.0.9 εγκαταστάθηκε"
|
||||
"message": "Εκδοση __RYD_VERSION__ εγκαταστάθηκε"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Τί νέο υπάρχει"
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "Update to"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Version 3.0.0.9 installed"
|
||||
"message": "Version __RYD_VERSION__ installed"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "What's new"
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "actualizar a"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Versión 3.0.0.9 instalada"
|
||||
"message": "Versión __RYD_VERSION__ instalada"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Novedades"
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"message": "mettre à jour vers"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Version 3.0.0.9 installée"
|
||||
"message": "Version __RYD_VERSION__ installée"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Quoi de neuf"
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"extensionName": {
|
||||
"message": "Return YouTube Dislike"
|
||||
},
|
||||
"extensionNameBeta": {
|
||||
"message": "Return YouTube Dislike Beta"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "Visszaállítja a dislike számlálót"
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "Készítő: Dmitry Selivanov & Community"
|
||||
},
|
||||
"linkWebsite": {
|
||||
"message": "Weboldal"
|
||||
},
|
||||
"linkFAQ": {
|
||||
"message": "GYIK"
|
||||
},
|
||||
"linkDonate": {
|
||||
"message": "Támogatás"
|
||||
},
|
||||
"linkHelp": {
|
||||
"message": "Segítség"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "Beállítások"
|
||||
},
|
||||
"textSettings": {
|
||||
"message": "Like/Dislike beküldés kikapcsolása"
|
||||
},
|
||||
"textLikesDisabled": {
|
||||
"message": "tulajdonos által kikapcsolva"
|
||||
},
|
||||
"textSettingsHover": {
|
||||
"message": "Nem számolja tovább a like és dislike adataidat."
|
||||
},
|
||||
"textTempUnavailable": {
|
||||
"message": "temp n/a"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "frissítés erre:"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "3.0.0.1 verzió telepítve"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Újdonságok"
|
||||
},
|
||||
"shortsSupport": {
|
||||
"message": "YouTube Shorts támogatás"
|
||||
},
|
||||
"customColors": {
|
||||
"message": "Egyéni színek a dislike csíkon és gombon"
|
||||
},
|
||||
"customNumberFormats": {
|
||||
"message": "Egyéni számformátum"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Ez a bővítmény kizárólag a támogatásoknak köszönhetően működik. Kérjük, támogasd a projektet!"
|
||||
}
|
||||
}
|
||||
@@ -6,81 +6,129 @@
|
||||
"message": "Return YouTube Dislike Beta"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "Ripristina la possibilità di vedere i dislikes"
|
||||
"message": "Riporta il numero di Non mi piace"
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "grazie a Dmitry Selivanov e alla Comunità"
|
||||
"message": "di Dmitry Selivanov e della comunità"
|
||||
},
|
||||
"linkWebsite": {
|
||||
"message": "Sito web"
|
||||
},
|
||||
"linkFAQ": {
|
||||
"message": "Domande frequenti"
|
||||
"message": "FAQ"
|
||||
},
|
||||
"linkDonate": {
|
||||
"message": "Fai una donazione"
|
||||
"message": "Dona"
|
||||
},
|
||||
"linkHelp": {
|
||||
"message": "Aiuto"
|
||||
},
|
||||
"linkChangelog": {
|
||||
"message": "Note di versione"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "Impostazioni"
|
||||
},
|
||||
"textSettings": {
|
||||
"message": "Disabilita l'invio dei like e dei dislike"
|
||||
"message": "Disattiva invio di Mi piace/Non mi piace"
|
||||
},
|
||||
"textLikesDisabled": {
|
||||
"message": "Disattivati dal proprietario"
|
||||
},
|
||||
"textSettingsHover": {
|
||||
"message": "Interrompe il conteggio dei tuoi likes e dislikes da parte dell'estensione."
|
||||
"message": "Smette di contare i tuoi Mi piace e Non mi piace."
|
||||
},
|
||||
"textRoundingNumbers": {
|
||||
"message": "Arrotonda per difetto il numero di Mi Piace/Non mi piace (comportamento standard di YouTube)."
|
||||
},
|
||||
"textRoundingNumbersHover": {
|
||||
"message": "Mostra stastistiche arrotondate per difetto."
|
||||
},
|
||||
"textConsistentFormat": {
|
||||
"message": "Rendi uniforme il formato di Mi piace e Non mi piace."
|
||||
},
|
||||
"textConsistentFormatHover": {
|
||||
"message": "Ri-formatta numero di Mi piace."
|
||||
},
|
||||
"textNumberFormat": {
|
||||
"message": "Formato numeri:"
|
||||
},
|
||||
"textColorizeRatioBar": {
|
||||
"message": "Colora barra di rapporto"
|
||||
},
|
||||
"textColorizeRatioBarHover": {
|
||||
"message": "Usa colori personalizzati per la barra di rapporto."
|
||||
},
|
||||
"textColorizeThumbs": {
|
||||
"message": "Colora pollici"
|
||||
},
|
||||
"textColorizeThumbsHover": {
|
||||
"message": "Usa colori personalizzati per le icone dei pollici."
|
||||
},
|
||||
"textColorTheme": {
|
||||
"message": "Colore tema:"
|
||||
},
|
||||
"textColorTheme1": {
|
||||
"message": "Classico"
|
||||
},
|
||||
"textColorTheme2": {
|
||||
"message": "Accessibile"
|
||||
},
|
||||
"textColorTheme3": {
|
||||
"message": "Neon"
|
||||
},
|
||||
"textTempUnavailable": {
|
||||
"message": "Temporaneamente non disponibile"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "aggiorna a"
|
||||
"message": "Aggiorna a"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Versione 3.0.0.9 installata"
|
||||
"message": "Versione __RYD_VERSION__ installata"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Quali sono le novità"
|
||||
"message": "Novità"
|
||||
},
|
||||
"shortsSupport": {
|
||||
"message": "Supporto per YouTube Shorts"
|
||||
},
|
||||
"customColors": {
|
||||
"message": "Colori personalizzati per la barra dei dislike e i bottoni"
|
||||
"message": "Colori personalizzati per barra dei Non mi piace e bottoni"
|
||||
},
|
||||
"customNumberFormats": {
|
||||
"message": "Formati numerici personalizzati"
|
||||
"message": "Formato numeri personalizzato"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Le uniche cosa che tengono in piedi il progetto sono le vostre donazioni. Per favore, considera di effettuare una donazione per supportarci. Grazie."
|
||||
"message": "L'unica cosa che manda avanti questa estensione sono le tue donazioni, valuta se sostenere il progetto."
|
||||
},
|
||||
"roundNumbers": {
|
||||
"message": "Mostra i numeri arrotondati"
|
||||
"message": "Mostra numeri arrotondati per difetto"
|
||||
},
|
||||
"roundNumbersHover": {
|
||||
"message": "Arrotonda il valore del conteggio (questa è l'opzione predefinita di YouTube)."
|
||||
"message": "Arrotonda numeri per difetto (comportamento standard di YouTube)."
|
||||
},
|
||||
"reformatLikes": {
|
||||
"message": "Formatta il numero di like"
|
||||
"message": "Ri-formatta numero Mi piace"
|
||||
},
|
||||
"reformatLikesHover": {
|
||||
"message": "Rende il valore delle statistiche più consistente."
|
||||
"message": "Rendi uniforme il formato di Mi piace e Non mi piace."
|
||||
},
|
||||
"numberFormat": {
|
||||
"message": "Formato numerico"
|
||||
"message": "Formato numeri:"
|
||||
},
|
||||
"colorizeRatio": {
|
||||
"message": "Colora la barra dei dislike"
|
||||
"message": "Colora barra di rapporto"
|
||||
},
|
||||
"colorizeRatioHover": {
|
||||
"message": "Colora la barra dei dislike con colori personalizzati."
|
||||
"message": "Usa colori personalizzati per la barra di rapporto."
|
||||
},
|
||||
"colorizeThumbs": {
|
||||
"message": "Colora i pulsanti"
|
||||
"message": "Colora pollici"
|
||||
},
|
||||
"colorizeThumbsHover": {
|
||||
"message": "Colora i pulsanti dei like e dei dislike con colori personalizzati."
|
||||
"message": "Usa colori personalizzati per le icone dei pollici."
|
||||
},
|
||||
"colorTheme": {
|
||||
"message": "Schema colori:"
|
||||
"message": "Colore tema:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"message": "アップデート:"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "バージョン 3.0.0.9 がインストールされました。"
|
||||
"message": "バージョン __RYD_VERSION__ がインストールされました。"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "新機能"
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "업데이트"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "3.0.0.9 버전이 설치됨"
|
||||
"message": "__RYD_VERSION__ 버전이 설치됨"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "새로운 점"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
|
||||
"extensionName": {
|
||||
"message": "Return YouTube Dislike"
|
||||
},
|
||||
@@ -6,7 +7,7 @@
|
||||
"message": "Return YouTube Dislike Beta"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "Retourneert het vermogen om dislikes te zien"
|
||||
"message": "Herstelt de functie om dislikes te kunnen zien"
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "door Dmitry Selivanov & Gemeenschap"
|
||||
@@ -24,7 +25,7 @@
|
||||
"message": "Help"
|
||||
},
|
||||
"linkChangelog": {
|
||||
"message": "Wijzig-log"
|
||||
"message": "Wijzigingslog"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "Instellingen"
|
||||
@@ -51,7 +52,7 @@
|
||||
"message": "Herformatteer als getallen."
|
||||
},
|
||||
"textNumberFormat": {
|
||||
"message": "Nummer formaat:"
|
||||
"message": "Getalnotatie:"
|
||||
},
|
||||
"textColorizeRatioBar": {
|
||||
"message": "Verhoudingsbalk inkleuren"
|
||||
@@ -60,13 +61,13 @@
|
||||
"message": "Gebruik aangepaste kleuren voor de verhoudingsbalk."
|
||||
},
|
||||
"textColorizeThumbs": {
|
||||
"message": "Duimen inkleuren"
|
||||
"message": "Duimpjes inkleuren"
|
||||
},
|
||||
"textColorizeThumbsHover": {
|
||||
"message": "Gebruik aangepaste kleuren voor duimpictogrammen."
|
||||
},
|
||||
"textColorTheme": {
|
||||
"message": "Kleuren thema:"
|
||||
"message": "Kleurenthema:"
|
||||
},
|
||||
"textColorTheme1": {
|
||||
"message": "Klassiek"
|
||||
@@ -81,16 +82,16 @@
|
||||
"message": "Tijdelijk niet beschikbaar"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "Update naar"
|
||||
"message": "Actualiseer naar"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Versie 3.0.0.9 geïnstalleerd"
|
||||
"message": "Versie 3.0.0.13 geïnstalleerd"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Wat is er nieuw"
|
||||
},
|
||||
"shortsSupport": {
|
||||
"message": "YouTube Shorts Ondersteuning"
|
||||
"message": "Ondersteuning voor YouTube Shorts"
|
||||
},
|
||||
"customColors": {
|
||||
"message": "Aangepaste kleuren voor afkeerbalk en knoppen"
|
||||
@@ -99,7 +100,7 @@
|
||||
"message": "Aangepaste getalnotaties"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Het enige dat de extensie draaiende houdt, zijn uw donaties, overweeg alstublieft om het project te steunen."
|
||||
"message": "Het enige dat de extensie draaiende houdt, zijn uw donaties. Overweeg alstublieft om het project te steunen."
|
||||
},
|
||||
"roundNumbers": {
|
||||
"message": "Afgeronde getallen weergeven"
|
||||
@@ -114,7 +115,7 @@
|
||||
"message": "Maak het formaat voor leuk en niet leuk consistent."
|
||||
},
|
||||
"numberFormat": {
|
||||
"message": "Nummer formaat:"
|
||||
"message": "Getalnotatie:"
|
||||
},
|
||||
"colorizeRatio": {
|
||||
"message": "Verhoudingsbalk inkleuren"
|
||||
@@ -123,12 +124,12 @@
|
||||
"message": "Gebruik aangepaste kleuren voor de verhoudingsbalk."
|
||||
},
|
||||
"colorizeThumbs": {
|
||||
"message": "Duimen inkleuren"
|
||||
"message": "Duimpjes inkleuren"
|
||||
},
|
||||
"colorizeThumbsHover": {
|
||||
"message": "Gebruik aangepaste kleuren voor de duimpictogrammen."
|
||||
},
|
||||
"colorTheme": {
|
||||
"message": "Kleuren thema:"
|
||||
"message": "Kleurenthema:"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
{
|
||||
"extensionName": {
|
||||
"message": "Return YouTube Dislike"
|
||||
},
|
||||
"extensionNameBeta": {
|
||||
"message": "Return YouTube Dislike Beta"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "Przywraca licznik łapek w dół"
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "przez Dmitry Selivanov & Społeczność"
|
||||
},
|
||||
"linkWebsite": {
|
||||
"message": "Strona"
|
||||
},
|
||||
"linkFAQ": {
|
||||
"message": "FAQ"
|
||||
},
|
||||
"linkDonate": {
|
||||
"message": "Wesprzyj"
|
||||
},
|
||||
"linkHelp": {
|
||||
"message": "Pomoc"
|
||||
},
|
||||
"linkChangelog": {
|
||||
"message": "Zmiany"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "Ustawienia"
|
||||
},
|
||||
"textSettings": {
|
||||
"message": "Wyłącz przesyłanie łapek"
|
||||
},
|
||||
"textLikesDisabled": {
|
||||
"message": "Wyłączone przez twórcę"
|
||||
},
|
||||
"textSettingsHover": {
|
||||
"message": "Przestaje liczyć Twoje łapki."
|
||||
},
|
||||
"textRoundingNumbers": {
|
||||
"message": "Zaokrąglaj łapki w górę/dół (domyślne zachowanie YouTube)"
|
||||
},
|
||||
"textRoundingNumbersHover": {
|
||||
"message": "Pokaż zaokrąglone w dół statystyki."
|
||||
},
|
||||
"textConsistentFormat": {
|
||||
"message": "Ujednolica format liczbowy łapek."
|
||||
},
|
||||
"textConsistentFormatHover": {
|
||||
"message": "Zmień formatowanie liczby łapek."
|
||||
},
|
||||
"textNumberFormat": {
|
||||
"message": "Format liczbowy:"
|
||||
},
|
||||
"textColorizeRatioBar": {
|
||||
"message": "Koloruj pasek ocen"
|
||||
},
|
||||
"textColorizeRatioBarHover": {
|
||||
"message": "Użyj własnych kolorów paska."
|
||||
},
|
||||
"textColorizeThumbs": {
|
||||
"message": "Koloruj łapki"
|
||||
},
|
||||
"textColorizeThumbsHover": {
|
||||
"message": "Użyj własnych kolorów łapek."
|
||||
},
|
||||
"textColorTheme": {
|
||||
"message": "Motyw kolorystyczny:"
|
||||
},
|
||||
"textColorTheme1": {
|
||||
"message": "Klasyczny"
|
||||
},
|
||||
"textColorTheme2": {
|
||||
"message": "Dostępny"
|
||||
},
|
||||
"textColorTheme3": {
|
||||
"message": "Neonowy"
|
||||
},
|
||||
"textTempUnavailable": {
|
||||
"message": "Tymczasowo niedostępny"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "Zaktualizuj do"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Zainstalowana wersja __RYD_VERSION__"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Co nowego"
|
||||
},
|
||||
"shortsSupport": {
|
||||
"message": "Wsparcie dla YouTube Shorts"
|
||||
},
|
||||
"customColors": {
|
||||
"message": "Własne kolory paska łapek i guzików"
|
||||
},
|
||||
"customNumberFormats": {
|
||||
"message": "Własne formaty liczbowe"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Jedyne co napędza ten projekt to wasze dotacje, prosimy o rozważenie wsparcia tego projektu."
|
||||
},
|
||||
"roundNumbers": {
|
||||
"message": "Pokaż zaokrąglone w dół liczby"
|
||||
},
|
||||
"roundNumbersHover": {
|
||||
"message": "Zaokrąglaj w dół liczby (domyślne zachowanie YouTube)."
|
||||
},
|
||||
"reformatLikes": {
|
||||
"message": "Zmień formatowanie liczby łapek."
|
||||
},
|
||||
"reformatLikesHover": {
|
||||
"message": "Ujednolica format liczbowy łapek."
|
||||
},
|
||||
"numberFormat": {
|
||||
"message": "Format liczbowy:"
|
||||
},
|
||||
"colorizeRatio": {
|
||||
"message": "Koloruj pasek ocen"
|
||||
},
|
||||
"colorizeRatioHover": {
|
||||
"message": "Użyj własnych kolorów paska."
|
||||
},
|
||||
"colorizeThumbs": {
|
||||
"message": "Koloruj łapki"
|
||||
},
|
||||
"colorizeThumbsHover": {
|
||||
"message": "Użyj własnych kolorów łapek."
|
||||
},
|
||||
"colorTheme": {
|
||||
"message": "Motyw kolorystyczny:"
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"extensionName": {
|
||||
"message": "Voltar Dislikes do YouTube"
|
||||
"message": "Volta Descurtidas do YouTube"
|
||||
},
|
||||
"extensionNameBeta": {
|
||||
"message": "Voltar Dislikes do YouTube Beta"
|
||||
"message": "Volta Descurtidas do YouTube Beta"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "Voltar os Deslikes do YouTube"
|
||||
"message": "Retorna a capacidade de ver descurtidas"
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "por Dmitry Selivanov e Comunidade"
|
||||
"message": "por Dmitry Selivanov & Comunidade"
|
||||
},
|
||||
"linkWebsite": {
|
||||
"message": "Website"
|
||||
@@ -18,45 +18,117 @@
|
||||
"message": "Perguntas Frequentes"
|
||||
},
|
||||
"linkDonate": {
|
||||
"message": "Doe"
|
||||
"message": "Doar"
|
||||
},
|
||||
"linkHelp": {
|
||||
"message": "Ajuda"
|
||||
},
|
||||
"linkChangelog": {
|
||||
"message": "Registro de alterações"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "Configurações"
|
||||
},
|
||||
"textSettings": {
|
||||
"message": "Desativar envio de Curtidas/Não Curtidas"
|
||||
"message": "Desativar envio de curtidas/descurtidas"
|
||||
},
|
||||
"textLikesDisabled": {
|
||||
"message": "Desativado pelo proprietário"
|
||||
},
|
||||
"textSettingsHover": {
|
||||
"message": "Parar de contar suas curtidas e não curtidas."
|
||||
"message": "Para de contar suas curtidas e descurtidas."
|
||||
},
|
||||
"textRoundingNumbers": {
|
||||
"message": "Arredondar as estatísticas de curtidas/descurtidas para baixo (comportamento padrão do YouTube)"
|
||||
},
|
||||
"textRoundingNumbersHover": {
|
||||
"message": "Mostrar estatísticas arredondadas"
|
||||
},
|
||||
"textConsistentFormat": {
|
||||
"message": "Tornar o formato de curtidas e descurtidas consistente"
|
||||
},
|
||||
"textConsistentFormatHover": {
|
||||
"message": "Re-formatar número de curtidas."
|
||||
},
|
||||
"textNumberFormat": {
|
||||
"message": "Formato numérico:"
|
||||
},
|
||||
"textColorizeRatioBar": {
|
||||
"message": "Colorir barra de proporção"
|
||||
},
|
||||
"textColorizeRatioBarHover": {
|
||||
"message": "Usar cores personalizadas para a barra de proporção."
|
||||
},
|
||||
"textColorizeThumbs": {
|
||||
"message": "Colorir botões"
|
||||
},
|
||||
"textColorizeThumbsHover": {
|
||||
"message": "Usar cores personalizadas para os botões de curtir e descurtir."
|
||||
},
|
||||
"textColorTheme": {
|
||||
"message": "Tema de cores:"
|
||||
},
|
||||
"textColorTheme1": {
|
||||
"message": "Clássico"
|
||||
},
|
||||
"textColorTheme2": {
|
||||
"message": "Acessível"
|
||||
},
|
||||
"textColorTheme3": {
|
||||
"message": "Néon"
|
||||
},
|
||||
"textTempUnavailable": {
|
||||
"message": "Temporariamente indisponível"
|
||||
"message": "Temporariamente Indisponível"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "Atualizar para"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Versão 3.0.0.9 instalada"
|
||||
"message": "Versão __RYD_VERSION__ instalada"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "O que há de novo?"
|
||||
"message": "O que há de novo?:"
|
||||
},
|
||||
"shortsSupport": {
|
||||
"message": "Suporte para Shorts"
|
||||
"message": "Suporte a curtas do YouTube"
|
||||
},
|
||||
"customColors": {
|
||||
"message": "Cores personalizadas para barra de não curtidas e botões"
|
||||
"message": "Cores personalizadas para barra de proporção e botões"
|
||||
},
|
||||
"customNumberFormats": {
|
||||
"message": "Formato de números personalizados"
|
||||
"message": "Formato numérico personalizado"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "A única coisa que mantém a extensão funcionando são suas doações, considere apoiar o projeto."
|
||||
},
|
||||
"roundNumbers": {
|
||||
"message": "Mostrar números arredondados"
|
||||
},
|
||||
"roundNumbersHover": {
|
||||
"message": "Arredondar os números para baixo (comportamento padrão do YouTube)."
|
||||
},
|
||||
"reformatLikes": {
|
||||
"message": "Re-formatar número de curtidas"
|
||||
},
|
||||
"reformatLikesHover": {
|
||||
"message": "Tornar o formato de curtidas e descurtidas consistente."
|
||||
},
|
||||
"numberFormat": {
|
||||
"message": "Formato numérico:"
|
||||
},
|
||||
"colorizeRatio": {
|
||||
"message": "Colorir barra de proporção"
|
||||
},
|
||||
"colorizeRatioHover": {
|
||||
"message": "Usar cores personalizadas para a barra de proporção."
|
||||
},
|
||||
"colorizeThumbs": {
|
||||
"message": "Colorir botões"
|
||||
},
|
||||
"colorizeThumbsHover": {
|
||||
"message": "Usar cores personalizadas para os botões de curtir e descurtir."
|
||||
},
|
||||
"colorTheme": {
|
||||
"message": "Tema de Cores:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"message": "обновление до"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Версия 3.0.0.9 установлена"
|
||||
"message": "Версия __RYD_VERSION__ установлена"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Что нового"
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "Uppdatera till"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Version 3.0.0.9 installerad"
|
||||
"message": "Version __RYD_VERSION__ installerad"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Vad är nytt"
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "Şu sürüme güncelle"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Sürüm 3.0.0.9 yüklendi"
|
||||
"message": "Sürüm __RYD_VERSION__ yüklendi"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Yeni Ne Var"
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "Оновлення до"
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Версію 3.0.0.9 встановлено"
|
||||
"message": "Версію __RYD_VERSION__ встановлено"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Що нового"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" />
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<svg width="48" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M14.9 3H6c-.9 0-1.6.5-1.9 1.2l-3 7c-.1.3-.1.5-.1.7v2c0 1.1.9 2 2 2h6.3l-.9 4.5c-.1.5 0 1 .4 1.4l1.1 1.1 6.5-6.6c.4-.4.6-.9.6-1.4V5c-.1-1.1-1-2-2.1-2zm7.4 12.8h-2.9c-.4 0-.7-.3-.7-.7V3.9c0-.4.3-.7.7-.7h2.9c.4 0 .7.3.7.7V15c0 .4-.3.8-.7.8z"
|
||||
fill="red"
|
||||
/>
|
||||
<path d="m8 12.5 5.1-2.9L8 6.7v5.8z" fill="#fff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 420 B |
@@ -2,7 +2,7 @@
|
||||
"name": "__MSG_extensionName__",
|
||||
"description": "__MSG_extensionDesc__",
|
||||
"default_locale": "en",
|
||||
"version": "3.0.0.9",
|
||||
"version": "__RYD_VERSION__",
|
||||
"manifest_version": 3,
|
||||
"background": {
|
||||
"service_worker": "ryd.background.js"
|
||||
@@ -11,8 +11,12 @@
|
||||
"48": "icons/icon48.png",
|
||||
"128": "icons/icon128.png"
|
||||
},
|
||||
"host_permissions": ["*://*.youtube.com/*"],
|
||||
"permissions": ["storage"],
|
||||
"host_permissions": [
|
||||
"*://*.youtube.com/*"
|
||||
],
|
||||
"permissions": [
|
||||
"storage"
|
||||
],
|
||||
"action": {
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
@@ -23,18 +27,31 @@
|
||||
"*://www.youtube.com/*",
|
||||
"*://m.youtube.com/*"
|
||||
],
|
||||
"exclude_matches": ["*://*.music.youtube.com/*"],
|
||||
"js": ["ryd.content-script.js"],
|
||||
"css": ["content-style.css"]
|
||||
"exclude_matches": [
|
||||
"*://*.music.youtube.com/*"
|
||||
],
|
||||
"js": [
|
||||
"ryd.content-script.js"
|
||||
],
|
||||
"css": [
|
||||
"content-style.css"
|
||||
]
|
||||
}
|
||||
],
|
||||
"externally_connectable": {
|
||||
"matches": ["*://*.youtube.com/*"]
|
||||
"matches": [
|
||||
"*://*.youtube.com/*"
|
||||
]
|
||||
},
|
||||
"web_accessible_resources": [
|
||||
{
|
||||
"resources": ["ryd.script.js"],
|
||||
"matches": ["*://*.youtube.com/*"]
|
||||
"resources": [
|
||||
"ryd.script.js",
|
||||
"menu-fixer.js"
|
||||
],
|
||||
"matches": [
|
||||
"*://*.youtube.com/*"
|
||||
]
|
||||
}
|
||||
],
|
||||
"options_ui": {
|
||||
|
||||
@@ -2,10 +2,12 @@
|
||||
"name": "__MSG_extensionName__",
|
||||
"description": "__MSG_extensionDesc__",
|
||||
"default_locale": "en",
|
||||
"version": "3.0.0.9",
|
||||
"version": "__RYD_VERSION__",
|
||||
"manifest_version": 2,
|
||||
"background": {
|
||||
"scripts": ["ryd.background.js"]
|
||||
"scripts": [
|
||||
"ryd.background.js"
|
||||
]
|
||||
},
|
||||
"icons": {
|
||||
"48": "icons/icon48.png",
|
||||
@@ -22,19 +24,31 @@
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["*://*.youtube.com/*"],
|
||||
"exclude_matches": ["*://*.music.youtube.com/*"],
|
||||
"matches": [
|
||||
"*://*.youtube.com/*"
|
||||
],
|
||||
"exclude_matches": [
|
||||
"*://*.music.youtube.com/*"
|
||||
],
|
||||
"run_at": "document_idle",
|
||||
"css": ["content-style.css"],
|
||||
"js": ["ryd.content-script.js"]
|
||||
"css": [
|
||||
"content-style.css"
|
||||
],
|
||||
"js": [
|
||||
"ryd.content-script.js"
|
||||
]
|
||||
}
|
||||
],
|
||||
"options_ui": {
|
||||
"page": "popup.html",
|
||||
"open_in_tab": false
|
||||
}
|
||||
// uncomment this section for local storage to work in firefox locally
|
||||
// "browser_specific_settings": {
|
||||
},
|
||||
"web_accessible_resources": [
|
||||
"menu-fixer.js"
|
||||
]
|
||||
|
||||
// uncomment this section for local storage to work in firefox locally,
|
||||
// ,"browser_specific_settings": {
|
||||
// "gecko": {
|
||||
// "id": "addon@example.com",
|
||||
// "strict_min_version": "42.0"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "__MSG_extensionName__",
|
||||
"description": "__MSG_extensionDesc__",
|
||||
"default_locale": "en",
|
||||
"version": "3.0.0.8",
|
||||
"version": "__RYD_VERSION__",
|
||||
"manifest_version": 2,
|
||||
"background": {
|
||||
"scripts": ["ryd.background.js"],
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
function debounceAsync(func, wait, renderer) {
|
||||
let timeout;
|
||||
let lastCallTime = 0;
|
||||
|
||||
return async function (...args) {
|
||||
const context = this;
|
||||
const now = Date.now();
|
||||
|
||||
if (!lastCallTime || now - lastCallTime > wait) {
|
||||
// If the last call was long enough ago or this is the first call, execute immediately
|
||||
lastCallTime = now;
|
||||
return await func.apply(context, args);
|
||||
} else {
|
||||
// Hide all optional menu items - prevents endless loop
|
||||
if (renderer?.polymerController?.flexAsTopLevelButtons) {
|
||||
renderer.polymerController.flexAsTopLevelButtons = [];
|
||||
}
|
||||
|
||||
// Otherwise, delay the call
|
||||
return new Promise((resolve) => {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(async () => {
|
||||
lastCallTime = Date.now();
|
||||
resolve(await func.apply(context, args));
|
||||
}, wait);
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
const fixYtdMenuRenderer = (ytdMenuRenderer) => {
|
||||
if (!ytdMenuRenderer?.polymerController?.maybeUpdateFlexibleMenuImpl) {
|
||||
return;
|
||||
}
|
||||
const originalMaybeUpdateFlexibleMenuImpl = ytdMenuRenderer.polymerController.maybeUpdateFlexibleMenuImpl.bind(
|
||||
ytdMenuRenderer.polymerController,
|
||||
);
|
||||
|
||||
ytdMenuRenderer.polymerController.maybeUpdateFlexibleMenuImpl = debounceAsync(
|
||||
originalMaybeUpdateFlexibleMenuImpl,
|
||||
100,
|
||||
ytdMenuRenderer,
|
||||
);
|
||||
};
|
||||
|
||||
const fixedYtdMenuRenderers = [];
|
||||
const observer = new MutationObserver(() => {
|
||||
const ytdMenuRenderers = [...document.querySelectorAll("ytd-menu-renderer")].filter(
|
||||
(el) => !fixedYtdMenuRenderers.includes(el),
|
||||
);
|
||||
if (!ytdMenuRenderers.length) return;
|
||||
|
||||
for (const el of ytdMenuRenderers) {
|
||||
fixYtdMenuRenderer(el);
|
||||
fixedYtdMenuRenderers.push(el);
|
||||
}
|
||||
});
|
||||
observer.observe(document.documentElement, {
|
||||
subtree: true,
|
||||
childList: true,
|
||||
});
|
||||
@@ -1,20 +1,52 @@
|
||||
/* Variables */
|
||||
:root {
|
||||
--primary: #cc2929;
|
||||
--accent: #581111;
|
||||
color-scheme: dark;
|
||||
|
||||
--background: #111;
|
||||
--secondary: #272727;
|
||||
--tertiary: #424242;
|
||||
--primary: #cc2929;
|
||||
--primary: #f39090;
|
||||
--secondary: #502e2e;
|
||||
--tertiary: #221818;
|
||||
--background: #352929;
|
||||
|
||||
--accent: #581111;
|
||||
--lightGrey: #999;
|
||||
--white: #fff;
|
||||
}
|
||||
|
||||
/*** MATERIAL 3 ***/
|
||||
.m3-primary {
|
||||
background: var(--primary) !important;
|
||||
color: var(--background) !important;
|
||||
}
|
||||
.m3-btn {
|
||||
background: var(--tertiary);
|
||||
color: var(--primary);
|
||||
transition: 0.4s;
|
||||
border-radius: 4px;
|
||||
font-weight: 500;
|
||||
border-radius: 100em;
|
||||
box-shadow: 0 5px 5px rgba(0,0,0,0.1);
|
||||
margin: 0.25em;
|
||||
}
|
||||
.m3-btn:hover {
|
||||
background: var(--secondary) !important;
|
||||
color: var(--primary) !important;
|
||||
}
|
||||
|
||||
select {
|
||||
border-radius: 1em;
|
||||
background-color: var(--secondary);
|
||||
color: var(--primary);
|
||||
border: none;
|
||||
outline: none;
|
||||
padding: 3px 2px;
|
||||
}
|
||||
/*** END MATERIAL 3 ***/
|
||||
|
||||
/* Window Styling */
|
||||
html,
|
||||
body {
|
||||
background-color: var(--background);
|
||||
color: var(--white);
|
||||
color: var(--primary);
|
||||
min-width: 310px;
|
||||
min-height: 350px;
|
||||
padding: 0.5em;
|
||||
@@ -26,30 +58,19 @@ h1 {
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
button {
|
||||
color: var(--white);
|
||||
background: var(--secondary);
|
||||
cursor: pointer;
|
||||
padding: 5px 16px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
font-weight: 500;
|
||||
/* box-shadow: 0 2px 4px -1px rgb(0 0 0 / 20%), 0 4px 5px 0 rgb(0 0 0 / 14%),
|
||||
0 1px 10px 0 rgb(0 0 0 / 12%); */
|
||||
transition: 0.4s;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background: #444;
|
||||
}
|
||||
|
||||
#ext-version {
|
||||
padding: 0.25rem 0.5rem;
|
||||
}
|
||||
|
||||
button {
|
||||
cursor: pointer;
|
||||
padding: 5px 16px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#ext-update {
|
||||
cursor: pointer;
|
||||
color: var(--white);
|
||||
color: var(--primary);
|
||||
text-decoration: none;
|
||||
background: var(--primary);
|
||||
border-radius: 0.25rem;
|
||||
@@ -74,7 +95,9 @@ button:hover {
|
||||
content: attr(data-hover);
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
transition: visibility 0.1s linear, opacity 0.1s linear;
|
||||
transition:
|
||||
visibility 0.1s linear,
|
||||
opacity 0.1s linear;
|
||||
width: 250px;
|
||||
background-color: var(--secondary);
|
||||
border-radius: 0.5rem;
|
||||
@@ -113,17 +136,17 @@ button:hover {
|
||||
position: fixed;
|
||||
background: none;
|
||||
box-shadow: none;
|
||||
color: var(--lightGrey);
|
||||
color: var(--primary);
|
||||
top: 26px;
|
||||
right: 26px;
|
||||
padding: 2px;
|
||||
z-index: 69;
|
||||
height: 2rem;
|
||||
width: 2rem;
|
||||
transition-duration: .25s;
|
||||
}
|
||||
|
||||
#advancedToggle:hover {
|
||||
color: var(--white);
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
@@ -143,11 +166,10 @@ button:hover {
|
||||
right: 14px;
|
||||
width: calc(100% - 65px);
|
||||
height: calc(100% - 58px);
|
||||
border: 2px solid var(--secondary);
|
||||
border-radius: 0.5rem;
|
||||
padding: 1rem;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
border: none;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
@@ -159,7 +181,7 @@ button:hover {
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background-color: #333; /* color of the scroll thumb */
|
||||
background-color: var(--primary); /* 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 */
|
||||
@@ -175,7 +197,7 @@ button:hover {
|
||||
}
|
||||
|
||||
#advancedLegend {
|
||||
color: var(--tertiary) !important;
|
||||
color: var(--secondary) !important;
|
||||
/* margin: auto; */ /* Center the label */
|
||||
/* padding: .25rem .5rem; */
|
||||
/* border-radius: .25rem; */
|
||||
@@ -226,7 +248,7 @@ button:hover {
|
||||
width: 13px;
|
||||
left: 2px;
|
||||
bottom: 2px;
|
||||
background: var(--lightGrey);
|
||||
background: var(--primary);
|
||||
transition: 0.4s;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<!--- HEADER -->
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" />
|
||||
<title title="__MSG_extensionName__">__MSG_extensionName__</title>
|
||||
@@ -11,15 +13,10 @@
|
||||
rel="stylesheet"
|
||||
/>
|
||||
</head>
|
||||
<!-- END HEADER -->
|
||||
<body>
|
||||
<center>
|
||||
<svg width="48" viewBox="0 0 24 24">
|
||||
<path
|
||||
d="M14.9 3H6c-.9 0-1.6.5-1.9 1.2l-3 7c-.1.3-.1.5-.1.7v2c0 1.1.9 2 2 2h6.3l-.9 4.5c-.1.5 0 1 .4 1.4l1.1 1.1 6.5-6.6c.4-.4.6-.9.6-1.4V5c-.1-1.1-1-2-2.1-2zm7.4 12.8h-2.9c-.4 0-.7-.3-.7-.7V3.9c0-.4.3-.7.7-.7h2.9c.4 0 .7.3.7.7V15c0 .4-.3.8-.7.8z"
|
||||
fill="red"
|
||||
/>
|
||||
<path d="m8 12.5 5.1-2.9L8 6.7v5.8z" fill="#fff" />
|
||||
</svg>
|
||||
<img src="icons/logo.svg" />
|
||||
<h1 style="margin-bottom: 0.75rem" title="__MSG_extensionName__">
|
||||
__MSG_extensionName__
|
||||
</h1>
|
||||
@@ -27,27 +24,29 @@
|
||||
__MSG_textDeveloper__
|
||||
</p>
|
||||
|
||||
<button id="link_website" title="__MSG_linkWebsite__">
|
||||
<button class="m3-btn" id="link_website" title="__MSG_linkWebsite__">
|
||||
__MSG_linkWebsite__
|
||||
</button>
|
||||
<button
|
||||
style="margin-top: 0.3em; background: #ff0000"
|
||||
class="m3-btn m3-primary"
|
||||
style="margin-top: 0.3em;"
|
||||
id="link_donate"
|
||||
title="__MSG_linkDonate__"
|
||||
>
|
||||
__MSG_linkDonate__
|
||||
</button>
|
||||
<button id="link_discord">Discord</button>
|
||||
<button class="m3-btn" id="link_discord">Discord</button>
|
||||
<br />
|
||||
<button style="margin-top: 0.3rem" id="link_faq" title="__MSG_linkFAQ__">
|
||||
<button class="m3-btn" style="margin-top: 0.3rem" id="link_faq" title="__MSG_linkFAQ__">
|
||||
__MSG_linkFAQ__
|
||||
</button>
|
||||
<button id="link_github">GitHub</button>
|
||||
<button style="margin-top: 0.3em" id="link_help" title="__MSG_linkHelp__">
|
||||
<button class="m3-btn" id="link_github">GitHub</button>
|
||||
<button class="m3-btn" style="margin-top: 0.3em" id="link_help" title="__MSG_linkHelp__">
|
||||
__MSG_linkHelp__
|
||||
</button>
|
||||
<br />
|
||||
<button
|
||||
class="m3-btn"
|
||||
style="margin-top: 0.3em"
|
||||
id="link_changelog"
|
||||
title="__MSG_linkChangelog__"
|
||||
@@ -85,7 +84,6 @@
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<!-- bottom-right -->
|
||||
<div id="ext">
|
||||
<a
|
||||
@@ -98,10 +96,6 @@
|
||||
|
||||
<!-- dialog box -->
|
||||
<fieldset id="advancedSettings">
|
||||
<legend id="advancedLegend" title="__MSG_legendSettings__">
|
||||
__MSG_legendSettings__
|
||||
</legend>
|
||||
|
||||
<label class="switch" data-hover="Stop counting your likes and dislikes">
|
||||
<input type="checkbox" id="disable_vote_submission" />
|
||||
<span class="slider"></span>
|
||||
@@ -109,6 +103,11 @@
|
||||
__MSG_textSettings__
|
||||
</span>
|
||||
</label>
|
||||
<label class="switch" data-hover="Disable Logging API Response in JavaScript Console.">
|
||||
<input type="checkbox" id="disable_logging"/>
|
||||
<span class="slider"/>
|
||||
<span class="switchLabel">Disable logging to console</span>
|
||||
</label>
|
||||
<br />
|
||||
<label class="switch" data-hover="__MSG_reformatLikesHover__">
|
||||
<input type="checkbox" id="number_reformat_likes" />
|
||||
|
||||
@@ -4,6 +4,7 @@ import { cLog } from "./src/utils";
|
||||
const config = {
|
||||
advanced: false,
|
||||
disableVoteSubmission: false,
|
||||
disableLogging: true,
|
||||
coloredThumbs: false,
|
||||
coloredBar: false,
|
||||
colorTheme: "classic",
|
||||
@@ -15,7 +16,6 @@ const config = {
|
||||
'<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:
|
||||
'<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"><path d="M0 0h24v24H0V0z" fill="none" opacity=".87"/><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm4.3 14.3c-.39.39-1.02.39-1.41 0L12 13.41 9.11 16.3c-.39.39-1.02.39-1.41 0-.39-.39-.39-1.02 0-1.41L10.59 12 7.7 9.11c-.39-.39-.39-1.02 0-1.41.39-.39 1.02-.39 1.41 0L12 10.59l2.89-2.89c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41L13.41 12l2.89 2.89c.38.38.38 1.02 0 1.41z"/></svg>',
|
||||
|
||||
links: {
|
||||
website: "https://returnyoutubedislike.com",
|
||||
github: "https://github.com/Anarios/return-youtube-dislike",
|
||||
@@ -68,6 +68,10 @@ document
|
||||
chrome.storage.sync.set({ disableVoteSubmission: ev.target.checked });
|
||||
});
|
||||
|
||||
document.getElementById("disable_logging").addEventListener("click", (ev) => {
|
||||
chrome.storage.sync.set({ disableLogging:ev.target.checked })
|
||||
});
|
||||
|
||||
document.getElementById("colored_thumbs").addEventListener("click", (ev) => {
|
||||
chrome.storage.sync.set({ coloredThumbs: ev.target.checked });
|
||||
});
|
||||
@@ -80,7 +84,6 @@ document.getElementById("color_theme").addEventListener("click", (ev) => {
|
||||
chrome.storage.sync.set({ colorTheme: ev.target.value });
|
||||
});
|
||||
|
||||
|
||||
document.getElementById("number_format").addEventListener("change", (ev) => {
|
||||
chrome.storage.sync.set({ numberDisplayFormat: ev.target.value });
|
||||
});
|
||||
@@ -125,6 +128,7 @@ initConfig();
|
||||
|
||||
function initConfig() {
|
||||
initializeDisableVoteSubmission();
|
||||
initializeDisableLogging();
|
||||
initializeVersionNumber();
|
||||
initializeColoredThumbs();
|
||||
initializeColoredBar();
|
||||
@@ -140,7 +144,7 @@ function initializeVersionNumber() {
|
||||
document.getElementById("ext-version").innerHTML = "v" + version;
|
||||
|
||||
fetch(
|
||||
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json"
|
||||
"https://raw.githubusercontent.com/Anarios/return-youtube-dislike/main/Extensions/combined/manifest-chrome.json",
|
||||
)
|
||||
.then((response) => response.json())
|
||||
.then((json) => {
|
||||
@@ -179,6 +183,12 @@ function initializeDisableVoteSubmission() {
|
||||
});
|
||||
}
|
||||
|
||||
function initializeDisableLogging(){
|
||||
chrome.storage.sync.get(['disableLogging'], (res) => {
|
||||
handleDisableLoggingChangeEvent(res.disableLogging);
|
||||
});
|
||||
}
|
||||
|
||||
function initializeColoredThumbs() {
|
||||
chrome.storage.sync.get(["coloredThumbs"], (res) => {
|
||||
handleColoredThumbsChangeEvent(res.coloredThumbs);
|
||||
@@ -197,7 +207,6 @@ function initializeColorTheme() {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function initializeTooltipPercentage() {
|
||||
chrome.storage.sync.get(["showTooltipPercentage"], (res) => {
|
||||
handleShowTooltipPercentageChangeEvent(res.showTooltipPercentage);
|
||||
@@ -238,9 +247,12 @@ chrome.storage.onChanged.addListener(storageChangeHandler);
|
||||
function storageChangeHandler(changes, area) {
|
||||
if (changes.disableVoteSubmission !== undefined) {
|
||||
handleDisableVoteSubmissionChangeEvent(
|
||||
changes.disableVoteSubmission.newValue
|
||||
changes.disableVoteSubmission.newValue,
|
||||
);
|
||||
}
|
||||
if (changes.disableLogging !== undefined) {
|
||||
handleDisableLoggingChangeEvent(changes.disableLogging.newValue);
|
||||
}
|
||||
if (changes.coloredThumbs !== undefined) {
|
||||
handleColoredThumbsChangeEvent(changes.coloredThumbs.newValue);
|
||||
}
|
||||
@@ -255,12 +267,12 @@ function storageChangeHandler(changes, area) {
|
||||
}
|
||||
if (changes.showTooltipPercentage !== undefined) {
|
||||
handleShowTooltipPercentageChangeEvent(
|
||||
changes.showTooltipPercentage.newValue
|
||||
changes.showTooltipPercentage.newValue,
|
||||
);
|
||||
}
|
||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||
handleNumberDisplayReformatLikesChangeEvent(
|
||||
changes.numberDisplayReformatLikes.newValue
|
||||
changes.numberDisplayReformatLikes.newValue,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -270,6 +282,11 @@ function handleDisableVoteSubmissionChangeEvent(value) {
|
||||
document.getElementById("disable_vote_submission").checked = value;
|
||||
}
|
||||
|
||||
function handleDisableLoggingChangeEvent(value) {
|
||||
config.disableLogging = value;
|
||||
document.getElementById("disable_logging").checked = value;
|
||||
}
|
||||
|
||||
function handleColoredThumbsChangeEvent(value) {
|
||||
config.coloredThumbs = value;
|
||||
document.getElementById("colored_thumbs").checked = value;
|
||||
@@ -298,8 +315,6 @@ function updateColorThemePreviewContent(themeName) {
|
||||
getColorFromTheme(themeName, false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function handleNumberDisplayFormatChangeEvent(value) {
|
||||
config.numberDisplayFormat = value;
|
||||
document
|
||||
@@ -336,7 +351,7 @@ function getNumberFormatter(optionSelect) {
|
||||
userLocales = new URL(
|
||||
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
||||
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
||||
?.getAttribute("href")
|
||||
?.getAttribute("href"),
|
||||
)?.searchParams?.get("locale");
|
||||
} catch {}
|
||||
|
||||
@@ -359,7 +374,7 @@ function getNumberFormatter(optionSelect) {
|
||||
{
|
||||
notation: formatterNotation,
|
||||
compactDisplay: formatterCompactDisplay,
|
||||
}
|
||||
},
|
||||
);
|
||||
return formatter;
|
||||
}
|
||||
@@ -368,7 +383,7 @@ function getNumberFormatter(optionSelect) {
|
||||
let status = document.getElementById("status");
|
||||
let serverStatus = document.getElementById("server-status");
|
||||
let resp = await fetch(
|
||||
"https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g"
|
||||
"https://returnyoutubedislikeapi.com/votes?videoId=YbJOTdZBX1g",
|
||||
);
|
||||
let result = await resp.status;
|
||||
if (result === 200) {
|
||||
|
||||
@@ -6,6 +6,7 @@ let api;
|
||||
/** stores extension's global config */
|
||||
let extConfig = {
|
||||
disableVoteSubmission: false,
|
||||
disableLogging: true,
|
||||
coloredThumbs: false,
|
||||
coloredBar: false,
|
||||
colorTheme: "classic", // classic, accessible, neon
|
||||
@@ -31,17 +32,12 @@ api.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
} else if (request.message == "set_state") {
|
||||
// chrome.identity.getAuthToken({ interactive: true }, function (token) {
|
||||
let token = "";
|
||||
fetch(
|
||||
`${apiUrl}/votes?videoId=${request.videoId}&likeCount=${
|
||||
request.likeCount || ""
|
||||
}`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
}
|
||||
)
|
||||
fetch(`${apiUrl}/votes?videoId=${request.videoId}&likeCount=${request.likeCount || ""}`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((response) => {
|
||||
sendResponse(response);
|
||||
@@ -146,15 +142,12 @@ async function sendVote(videoId, vote) {
|
||||
async function register() {
|
||||
const userId = generateUserID();
|
||||
api.storage.sync.set({ userId });
|
||||
const registrationResponse = await fetch(
|
||||
`${apiUrl}/puzzle/registration?userId=${userId}`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
}
|
||||
).then((response) => response.json());
|
||||
const registrationResponse = await fetch(`${apiUrl}/puzzle/registration?userId=${userId}`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
}).then((response) => response.json());
|
||||
const solvedPuzzle = await solvePuzzle(registrationResponse);
|
||||
if (!solvedPuzzle.solution) {
|
||||
await register();
|
||||
@@ -209,9 +202,7 @@ function countLeadingZeroes(uInt8View, limit) {
|
||||
}
|
||||
|
||||
async function solvePuzzle(puzzle) {
|
||||
let challenge = Uint8Array.from(atob(puzzle.challenge), (c) =>
|
||||
c.charCodeAt(0)
|
||||
);
|
||||
let challenge = Uint8Array.from(atob(puzzle.challenge), (c) => c.charCodeAt(0));
|
||||
let buffer = new ArrayBuffer(20);
|
||||
let uInt8View = new Uint8Array(buffer);
|
||||
let uInt32View = new Uint32Array(buffer);
|
||||
@@ -234,8 +225,7 @@ async function solvePuzzle(puzzle) {
|
||||
}
|
||||
|
||||
function generateUserID(length = 36) {
|
||||
const charset =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
let result = "";
|
||||
if (crypto && crypto.getRandomValues) {
|
||||
const values = new Uint32Array(length);
|
||||
@@ -254,9 +244,7 @@ function generateUserID(length = 36) {
|
||||
|
||||
function storageChangeHandler(changes, area) {
|
||||
if (changes.disableVoteSubmission !== undefined) {
|
||||
handleDisableVoteSubmissionChangeEvent(
|
||||
changes.disableVoteSubmission.newValue
|
||||
);
|
||||
handleDisableVoteSubmissionChangeEvent(changes.disableVoteSubmission.newValue);
|
||||
}
|
||||
if (changes.coloredThumbs !== undefined) {
|
||||
handleColoredThumbsChangeEvent(changes.coloredThumbs.newValue);
|
||||
@@ -271,19 +259,16 @@ function storageChangeHandler(changes, area) {
|
||||
handleNumberDisplayFormatChangeEvent(changes.numberDisplayFormat.newValue);
|
||||
}
|
||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||
handleNumberDisplayReformatLikesChangeEvent(
|
||||
changes.numberDisplayReformatLikes.newValue
|
||||
);
|
||||
handleNumberDisplayReformatLikesChangeEvent(changes.numberDisplayReformatLikes.newValue);
|
||||
}
|
||||
if (changes.disableLogging !== undefined) {
|
||||
handleDisableLoggingChangeEvent(changes.disableLogging.newValue);
|
||||
}
|
||||
if (changes.showTooltipPercentage !== undefined) {
|
||||
handleShowTooltipPercentageChangeEvent(
|
||||
changes.showTooltipPercentage.newValue
|
||||
);
|
||||
handleShowTooltipPercentageChangeEvent(changes.showTooltipPercentage.newValue);
|
||||
}
|
||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||
handleNumberDisplayReformatLikesChangeEvent(
|
||||
changes.numberDisplayReformatLikes.newValue
|
||||
);
|
||||
handleNumberDisplayReformatLikesChangeEvent(changes.numberDisplayReformatLikes.newValue);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,6 +281,10 @@ function handleDisableVoteSubmissionChangeEvent(value) {
|
||||
}
|
||||
}
|
||||
|
||||
function handleDisableLoggingChangeEvent(value) {
|
||||
extConfig.disableLogging = value;
|
||||
}
|
||||
|
||||
function handleNumberDisplayFormatChangeEvent(value) {
|
||||
extConfig.numberDisplayFormat = value;
|
||||
}
|
||||
@@ -312,10 +301,8 @@ function handleTooltipPercentageModeChangeEvent(value) {
|
||||
}
|
||||
|
||||
function changeIcon(iconName) {
|
||||
if (api.action !== undefined)
|
||||
api.action.setIcon({ path: "/icons/" + iconName });
|
||||
else if (api.browserAction !== undefined)
|
||||
api.browserAction.setIcon({ path: "/icons/" + iconName });
|
||||
if (api.action !== undefined) api.action.setIcon({ path: "/icons/" + iconName });
|
||||
else if (api.browserAction !== undefined) api.browserAction.setIcon({ path: "/icons/" + iconName });
|
||||
else console.log("changing icon is not supported");
|
||||
}
|
||||
|
||||
@@ -342,6 +329,7 @@ api.storage.onChanged.addListener(storageChangeHandler);
|
||||
|
||||
function initExtConfig() {
|
||||
initializeDisableVoteSubmission();
|
||||
initializeDisableLogging();
|
||||
initializeColoredThumbs();
|
||||
initializeColoredBar();
|
||||
initializeColorTheme();
|
||||
@@ -362,6 +350,16 @@ function initializeDisableVoteSubmission() {
|
||||
});
|
||||
}
|
||||
|
||||
function initializeDisableLogging() {
|
||||
api.storage.sync.get(["disableLogging"], (res) => {
|
||||
if (res.disableLogging === undefined) {
|
||||
api.storage.sync.set({ disableLogging: true });
|
||||
} else {
|
||||
extConfig.disableLogging = res.disableLogging;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initializeColoredThumbs() {
|
||||
api.storage.sync.get(["coloredThumbs"], (res) => {
|
||||
if (res.coloredThumbs === undefined) {
|
||||
@@ -437,7 +435,5 @@ function isChrome() {
|
||||
}
|
||||
|
||||
function isFirefox() {
|
||||
return (
|
||||
typeof browser !== "undefined" && typeof browser.runtime !== "undefined"
|
||||
);
|
||||
return typeof browser !== "undefined" && typeof browser.runtime !== "undefined";
|
||||
}
|
||||
|
||||
@@ -1,77 +1,53 @@
|
||||
//--- Import Button Functions ---//
|
||||
import {
|
||||
getButtons,
|
||||
getLikeButton,
|
||||
getDislikeButton,
|
||||
checkForSignInButton,
|
||||
} from "./src/buttons";
|
||||
import { getButtons } from "./src/buttons";
|
||||
|
||||
//--- Import State Functions ---//
|
||||
import {
|
||||
isMobile,
|
||||
isShorts,
|
||||
isVideoDisliked,
|
||||
isVideoLiked,
|
||||
getState,
|
||||
setState,
|
||||
setInitialState,
|
||||
setLikes,
|
||||
setDislikes,
|
||||
getLikeCountFromButton,
|
||||
LIKED_STATE,
|
||||
DISLIKED_STATE,
|
||||
NEUTRAL_STATE,
|
||||
initExtConfig,
|
||||
} from "./src/state";
|
||||
import { isShorts, setInitialState, initExtConfig } from "./src/state";
|
||||
|
||||
//--- Import Video & Browser Functions ---//
|
||||
import {
|
||||
numberFormat,
|
||||
getBrowser,
|
||||
getVideoId,
|
||||
isVideoLoaded,
|
||||
cLog,
|
||||
} from "./src/utils";
|
||||
import { createRateBar } from "./src/bar";
|
||||
import {
|
||||
sendVote,
|
||||
likeClicked,
|
||||
dislikeClicked,
|
||||
addLikeDislikeEventListener,
|
||||
storageChangeHandler,
|
||||
} from "./src/events";
|
||||
import { getBrowser, isVideoLoaded, cLog } from "./src/utils";
|
||||
import { addLikeDislikeEventListener, createSmartimationObserver, storageChangeHandler } from "./src/events";
|
||||
|
||||
initExtConfig();
|
||||
await initExtConfig();
|
||||
|
||||
let jsInitChecktimer = null;
|
||||
let isSetInitialStateDone = false;
|
||||
|
||||
function setEventListeners(evt) {
|
||||
function checkForJS_Finish() {
|
||||
async function setEventListeners(evt) {
|
||||
async function checkForJS_Finish() {
|
||||
try {
|
||||
if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) {
|
||||
addLikeDislikeEventListener();
|
||||
setInitialState();
|
||||
isSetInitialStateDone = true;
|
||||
getBrowser().storage.onChanged.addListener(storageChangeHandler);
|
||||
clearInterval(jsInitChecktimer);
|
||||
jsInitChecktimer = null;
|
||||
}
|
||||
} catch(exception) {
|
||||
if(!isSetInitialStateDone) {
|
||||
setInitialState();
|
||||
createSmartimationObserver();
|
||||
addLikeDislikeEventListener();
|
||||
await setInitialState();
|
||||
isSetInitialStateDone = true;
|
||||
getBrowser().storage.onChanged.addListener(storageChangeHandler);
|
||||
}
|
||||
} catch (exception) {
|
||||
if (!isSetInitialStateDone) {
|
||||
cLog("error");
|
||||
await setInitialState();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
jsInitChecktimer = setInterval(checkForJS_Finish, 111);
|
||||
if (jsInitChecktimer !== null) clearInterval(jsInitChecktimer);
|
||||
jsInitChecktimer = setInterval(await checkForJS_Finish, 111);
|
||||
}
|
||||
|
||||
setEventListeners();
|
||||
await setEventListeners();
|
||||
|
||||
document.addEventListener("yt-navigate-finish", function (event) {
|
||||
document.addEventListener("yt-navigate-finish", async function (event) {
|
||||
if (jsInitChecktimer !== null) clearInterval(jsInitChecktimer);
|
||||
window.returnDislikeButtonlistenersSet = false;
|
||||
setEventListeners();
|
||||
await setEventListeners();
|
||||
});
|
||||
|
||||
const s = document.createElement("script");
|
||||
s.src = chrome.runtime.getURL("menu-fixer.js");
|
||||
s.onload = function () {
|
||||
this.remove();
|
||||
};
|
||||
// see also "Dynamic values in the injected code" section in this answer
|
||||
(document.head || document.documentElement).appendChild(s);
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`getNumberFormatter should return a correct formatter when falling back to default locale 1`] = `NumberFormat {}`;
|
||||
|
||||
exports[`getNumberFormatter should return a correct formatter when using chrome 1`] = `NumberFormat {}`;
|
||||
|
||||
exports[`getNumberFormatter should return a correct formatter when using firefox 1`] = `NumberFormat {}`;
|
||||
|
||||
exports[`getNumberFormatter should return a correct formatter when using the URL locale (possibly buggy) 1`] = `NumberFormat {}`;
|
||||
|
||||
exports[`getNumberFormatter should return a correct formatter when using the URL locale 1`] = `NumberFormat {}`;
|
||||
|
||||
exports[`getNumberFormatter should return a correct formatter whith standard option 1`] = `NumberFormat {}`;
|
||||
|
||||
exports[`getNumberFormatter should return a correct formatter with compactLong option 1`] = `NumberFormat {}`;
|
||||
@@ -13,14 +13,14 @@ function createRateBar(likes, dislikes) {
|
||||
let rateBar = document.getElementById("ryd-bar-container");
|
||||
if (!isLikesDisabled()) {
|
||||
// sometimes rate bar is hidden
|
||||
if(rateBar && !isInViewport(rateBar)){
|
||||
if (rateBar && !isInViewport(rateBar)) {
|
||||
rateBar.remove();
|
||||
rateBar = null;
|
||||
}
|
||||
|
||||
const widthPx =
|
||||
getLikeButton().clientWidth +
|
||||
getDislikeButton().clientWidth +
|
||||
parseFloat(window.getComputedStyle(getLikeButton()).width) +
|
||||
parseFloat(window.getComputedStyle(getDislikeButton()).width) +
|
||||
(isRoundedDesign() ? 0 : 8);
|
||||
|
||||
const widthPercent =
|
||||
@@ -60,10 +60,13 @@ function createRateBar(likes, dislikes) {
|
||||
colorLikeStyle = "; background-color: " + getColorFromTheme(true);
|
||||
colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
|
||||
}
|
||||
let actions = isNewDesign() && getButtons().id === "top-level-buttons-computed"
|
||||
? getButtons() : document.getElementById("menu-container");
|
||||
let actions =
|
||||
isNewDesign() && getButtons().id === "top-level-buttons-computed"
|
||||
? getButtons()
|
||||
: document.getElementById("menu-container");
|
||||
(
|
||||
actions || document.querySelector("ytm-slim-video-action-bar-renderer")
|
||||
actions ||
|
||||
document.querySelector("ytm-slim-video-action-bar-renderer")
|
||||
).insertAdjacentHTML(
|
||||
"beforeend",
|
||||
`
|
||||
@@ -83,7 +86,7 @@ function createRateBar(likes, dislikes) {
|
||||
<!--css-build:shady-->${tooltipInnerHTML}
|
||||
</tp-yt-paper-tooltip>
|
||||
</div>
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
if (isNewDesign()) {
|
||||
@@ -101,8 +104,7 @@ function createRateBar(likes, dislikes) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
document.getElementById("ryd-bar-container").style.width =
|
||||
widthPx + "px";
|
||||
document.querySelector(`.ryd-tooltip`).style.width = widthPx + "px";
|
||||
document.getElementById("ryd-bar").style.width = widthPercent + "%";
|
||||
document.querySelector("#ryd-dislike-tooltip > #tooltip").innerHTML =
|
||||
tooltipInnerHTML;
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
import { isMobile, isShorts } from "./state";
|
||||
import { isInViewport } from "./utils";
|
||||
import { isMobile, isShorts, extConfig } from "./state";
|
||||
import { isInViewport, querySelector, querySelectorAll } from "./utils";
|
||||
|
||||
function getButtons() {
|
||||
//--- If Watching Youtube Shorts: ---//
|
||||
if (isShorts()) {
|
||||
let elements = document.querySelectorAll(
|
||||
isMobile()
|
||||
? "ytm-like-button-renderer"
|
||||
: "#like-button > ytd-like-button-renderer"
|
||||
);
|
||||
let elements = isMobile()
|
||||
? querySelectorAll(extConfig.selectors.buttons.shorts.mobile)
|
||||
: querySelectorAll(extConfig.selectors.buttons.shorts.desktop);
|
||||
|
||||
for (let element of elements) {
|
||||
//Youtube Shorts can have multiple like/dislike buttons when scrolling through videos
|
||||
//YouTube Shorts can have multiple like/dislike buttons when scrolling through videos
|
||||
//However, only one of them should be visible (no matter how you zoom)
|
||||
if (isInViewport(element)) {
|
||||
return element;
|
||||
@@ -19,56 +18,92 @@ function getButtons() {
|
||||
}
|
||||
//--- If Watching On Mobile: ---//
|
||||
if (isMobile()) {
|
||||
return document.querySelector(".slim-video-action-bar-actions");
|
||||
return document.querySelector(extConfig.selectors.buttons.regular.mobile);
|
||||
}
|
||||
//--- If Menu Element Is Displayed: ---//
|
||||
if (document.getElementById("menu-container")?.offsetParent === null) {
|
||||
return document.querySelector("ytd-menu-renderer.ytd-watch-metadata > div");
|
||||
if (querySelector(extConfig.selectors.menuContainer)?.offsetParent === null) {
|
||||
return querySelector(extConfig.selectors.buttons.regular.desktopMenu);
|
||||
//--- If Menu Element Isn't Displayed: ---//
|
||||
} else {
|
||||
return document
|
||||
.getElementById("menu-container")
|
||||
?.querySelector("#top-level-buttons-computed");
|
||||
return querySelector(extConfig.selectors.buttons.regular.desktopNoMenu);
|
||||
}
|
||||
}
|
||||
|
||||
function getLikeButton() {
|
||||
return getButtons().children[0].tagName ===
|
||||
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||
? document.querySelector("#segmented-like-button") !== null ? document.querySelector("#segmented-like-button") : getButtons().children[0].children[0]
|
||||
: getButtons().children[0];
|
||||
? querySelector(extConfig.selectors.buttons.likeButton.segmented) ??
|
||||
querySelector(
|
||||
extConfig.selectors.buttons.likeButton.segmentedGetButtons,
|
||||
getButtons(),
|
||||
)
|
||||
: querySelector(
|
||||
extConfig.selectors.buttons.likeButton.notSegmented,
|
||||
getButtons(),
|
||||
);
|
||||
}
|
||||
|
||||
function getLikeTextContainer() {
|
||||
return (
|
||||
getLikeButton().querySelector("#text") ??
|
||||
getLikeButton().getElementsByTagName("yt-formatted-string")[0] ??
|
||||
getLikeButton().querySelector("span[role='text']")
|
||||
);
|
||||
return querySelector(extConfig.selectors.likeTextContainer, getLikeButton());
|
||||
}
|
||||
|
||||
function getDislikeButton() {
|
||||
return getButtons().children[0].tagName ===
|
||||
"YTD-SEGMENTED-LIKE-DISLIKE-BUTTON-RENDERER"
|
||||
? getButtons().children[0].children[1] === undefined ? document.querySelector("#segmented-dislike-button") : getButtons().children[0].children[1]
|
||||
: getButtons().children[1];
|
||||
? querySelector(extConfig.selectors.buttons.dislikeButton.segmented) ??
|
||||
querySelector(
|
||||
extConfig.selectors.buttons.dislikeButton.segmentedGetButtons,
|
||||
getButtons(),
|
||||
)
|
||||
: isShorts()
|
||||
? querySelector(["#dislike-button"], getButtons())
|
||||
: querySelector(
|
||||
extConfig.selectors.buttons.dislikeButton.notSegmented,
|
||||
getButtons(),
|
||||
);
|
||||
}
|
||||
|
||||
function createDislikeTextContainer() {
|
||||
const textNodeClone = getLikeButton().querySelector("button > div[class*='cbox']").cloneNode(true);
|
||||
const insertPreChild = getDislikeButton().querySelector("yt-touch-feedback-shape");
|
||||
getDislikeButton().querySelector("button").insertBefore(textNodeClone, insertPreChild);
|
||||
getDislikeButton().querySelector("button").classList.remove("yt-spec-button-shape-next--icon-button");
|
||||
getDislikeButton().querySelector("button").classList.add("yt-spec-button-shape-next--icon-leading");
|
||||
textNodeClone.querySelector("span[role='text']").innerText = "";
|
||||
return textNodeClone.querySelector("span[role='text']");
|
||||
const textNodeClone = (
|
||||
getLikeButton().querySelector(
|
||||
".yt-spec-button-shape-next__button-text-content",
|
||||
) ||
|
||||
getLikeButton().querySelector("button > div[class*='cbox']") ||
|
||||
(
|
||||
getLikeButton().querySelector('div > span[role="text"]') ||
|
||||
document.querySelector(
|
||||
'button > div.yt-spec-button-shape-next__button-text-content > span[role="text"]',
|
||||
)
|
||||
).parentNode
|
||||
).cloneNode(true);
|
||||
const insertPreChild = getDislikeButton().querySelector("button");
|
||||
insertPreChild.insertBefore(textNodeClone, null);
|
||||
getDislikeButton()
|
||||
.querySelector("button")
|
||||
.classList.remove("yt-spec-button-shape-next--icon-button");
|
||||
getDislikeButton()
|
||||
.querySelector("button")
|
||||
.classList.add("yt-spec-button-shape-next--icon-leading");
|
||||
if (textNodeClone.querySelector("span[role='text']") === null) {
|
||||
const span = document.createElement("span");
|
||||
span.setAttribute("role", "text");
|
||||
while (textNodeClone.firstChild) {
|
||||
textNodeClone.removeChild(textNodeClone.firstChild);
|
||||
}
|
||||
textNodeClone.appendChild(span);
|
||||
}
|
||||
textNodeClone.innerText = "";
|
||||
return textNodeClone;
|
||||
}
|
||||
|
||||
function getDislikeTextContainer() {
|
||||
let result =
|
||||
getDislikeButton().querySelector("#text") ??
|
||||
getDislikeButton().getElementsByTagName("yt-formatted-string")[0] ??
|
||||
getDislikeButton().querySelector("span[role='text']");
|
||||
let result;
|
||||
for (const selector of extConfig.selectors.dislikeTextContainer) {
|
||||
result = getDislikeButton().querySelector(selector);
|
||||
if (result !== null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (result == null) {
|
||||
result = createDislikeTextContainer();
|
||||
}
|
||||
@@ -78,7 +113,7 @@ function getDislikeTextContainer() {
|
||||
function checkForSignInButton() {
|
||||
if (
|
||||
document.querySelector(
|
||||
"a[href^='https://accounts.google.com/ServiceLogin']"
|
||||
"a[href^='https://accounts.google.com/ServiceLogin']",
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
import { getBrowser, getVideoId, numberFormat, cLog } from "./utils";
|
||||
import { checkForSignInButton, getButtons, getDislikeButton, getLikeButton } from './buttons';
|
||||
import {
|
||||
getBrowser,
|
||||
getVideoId,
|
||||
numberFormat,
|
||||
cLog,
|
||||
createObserver,
|
||||
} from "./utils";
|
||||
import {
|
||||
checkForSignInButton,
|
||||
getButtons,
|
||||
getDislikeButton,
|
||||
getLikeButton,
|
||||
} from "./buttons";
|
||||
import {
|
||||
NEUTRAL_STATE,
|
||||
LIKED_STATE,
|
||||
@@ -22,24 +33,28 @@ function sendVote(vote) {
|
||||
}
|
||||
}
|
||||
|
||||
function updateDOMDislikes() {
|
||||
setDislikes(numberFormat(storedData.dislikes));
|
||||
createRateBar(storedData.likes, storedData.dislikes);
|
||||
}
|
||||
|
||||
function likeClicked() {
|
||||
if (checkForSignInButton() === false) {
|
||||
if (storedData.previousState === DISLIKED_STATE) {
|
||||
sendVote(1);
|
||||
if (storedData.dislikes > 0) storedData.dislikes--;
|
||||
storedData.likes++;
|
||||
createRateBar(storedData.likes, storedData.dislikes);
|
||||
setDislikes(numberFormat(storedData.dislikes));
|
||||
updateDOMDislikes();
|
||||
storedData.previousState = LIKED_STATE;
|
||||
} else if (storedData.previousState === NEUTRAL_STATE) {
|
||||
sendVote(1);
|
||||
storedData.likes++;
|
||||
createRateBar(storedData.likes, storedData.dislikes);
|
||||
updateDOMDislikes();
|
||||
storedData.previousState = LIKED_STATE;
|
||||
} else if ((storedData.previousState = LIKED_STATE)) {
|
||||
sendVote(0);
|
||||
if (storedData.likes > 0) storedData.likes--;
|
||||
createRateBar(storedData.likes, storedData.dislikes);
|
||||
updateDOMDislikes();
|
||||
storedData.previousState = NEUTRAL_STATE;
|
||||
}
|
||||
if (extConfig.numberDisplayReformatLikes === true) {
|
||||
@@ -56,21 +71,18 @@ function dislikeClicked() {
|
||||
if (storedData.previousState === NEUTRAL_STATE) {
|
||||
sendVote(-1);
|
||||
storedData.dislikes++;
|
||||
setDislikes(numberFormat(storedData.dislikes));
|
||||
createRateBar(storedData.likes, storedData.dislikes);
|
||||
updateDOMDislikes();
|
||||
storedData.previousState = DISLIKED_STATE;
|
||||
} else if (storedData.previousState === DISLIKED_STATE) {
|
||||
sendVote(0);
|
||||
if (storedData.dislikes > 0) storedData.dislikes--;
|
||||
setDislikes(numberFormat(storedData.dislikes));
|
||||
createRateBar(storedData.likes, storedData.dislikes);
|
||||
updateDOMDislikes();
|
||||
storedData.previousState = NEUTRAL_STATE;
|
||||
} else if (storedData.previousState === LIKED_STATE) {
|
||||
sendVote(-1);
|
||||
if (storedData.likes > 0) storedData.likes--;
|
||||
storedData.dislikes++;
|
||||
setDislikes(numberFormat(storedData.dislikes));
|
||||
createRateBar(storedData.likes, storedData.dislikes);
|
||||
updateDOMDislikes();
|
||||
storedData.previousState = DISLIKED_STATE;
|
||||
if (extConfig.numberDisplayReformatLikes === true) {
|
||||
const nativeLikes = getLikeCountFromButton();
|
||||
@@ -83,21 +95,50 @@ function dislikeClicked() {
|
||||
}
|
||||
|
||||
function addLikeDislikeEventListener() {
|
||||
if (!window.returnDislikeButtonlistenersSet) {
|
||||
if (window.rydPreNavigateLikeButton !== getLikeButton()) {
|
||||
getLikeButton().addEventListener("click", likeClicked);
|
||||
getLikeButton().addEventListener("touchstart", likeClicked);
|
||||
if(getDislikeButton()) {
|
||||
if (getDislikeButton()) {
|
||||
getDislikeButton().addEventListener("click", dislikeClicked);
|
||||
getDislikeButton().addEventListener("touchstart", dislikeClicked);
|
||||
getDislikeButton().addEventListener("focusin", updateDOMDislikes);
|
||||
getDislikeButton().addEventListener("focusout", updateDOMDislikes);
|
||||
}
|
||||
window.returnDislikeButtonlistenersSet = true;
|
||||
window.rydPreNavigateLikeButton = getLikeButton();
|
||||
}
|
||||
}
|
||||
|
||||
let smartimationObserver = null;
|
||||
|
||||
function createSmartimationObserver() {
|
||||
if (!smartimationObserver) {
|
||||
smartimationObserver = createObserver(
|
||||
{
|
||||
attributes: true,
|
||||
subtree: true,
|
||||
childList: true,
|
||||
},
|
||||
updateDOMDislikes,
|
||||
);
|
||||
smartimationObserver.container = null;
|
||||
}
|
||||
|
||||
const smartimationContainer = getButtons().querySelector("yt-smartimation");
|
||||
if (
|
||||
smartimationContainer &&
|
||||
smartimationObserver.container != smartimationContainer
|
||||
) {
|
||||
cLog("Initializing smartimation mutation observer");
|
||||
smartimationObserver.disconnect();
|
||||
smartimationObserver.observe(smartimationContainer);
|
||||
smartimationObserver.container = smartimationContainer;
|
||||
}
|
||||
}
|
||||
|
||||
function storageChangeHandler(changes, area) {
|
||||
if (changes.disableVoteSubmission !== undefined) {
|
||||
handleDisableVoteSubmissionChangeEvent(
|
||||
changes.disableVoteSubmission.newValue
|
||||
changes.disableVoteSubmission.newValue,
|
||||
);
|
||||
}
|
||||
if (changes.coloredThumbs !== undefined) {
|
||||
@@ -114,7 +155,7 @@ function storageChangeHandler(changes, area) {
|
||||
}
|
||||
if (changes.numberDisplayReformatLikes !== undefined) {
|
||||
handleNumberDisplayReformatLikesChangeEvent(
|
||||
changes.numberDisplayReformatLikes.newValue
|
||||
changes.numberDisplayReformatLikes.newValue,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -149,5 +190,6 @@ export {
|
||||
likeClicked,
|
||||
dislikeClicked,
|
||||
addLikeDislikeEventListener,
|
||||
createSmartimationObserver,
|
||||
storageChangeHandler,
|
||||
};
|
||||
|
||||
@@ -9,7 +9,7 @@ function createStarRating(rating, isMobile) {
|
||||
starSlider.setAttribute("readonly", "");
|
||||
starSlider.setAttribute(
|
||||
"style",
|
||||
`--fill:rgb(255, 215, 0);--value:${rating.toString()};};background-color: transparent;`
|
||||
`--fill:rgb(255, 215, 0);--value:${rating.toString()};};background-color: transparent;`,
|
||||
);
|
||||
starSlider.setAttribute("type", "range");
|
||||
|
||||
@@ -19,11 +19,11 @@ function createStarRating(rating, isMobile) {
|
||||
|
||||
if (isMobile) {
|
||||
YTLikeButton = document.querySelector(
|
||||
"#app > div.page-container > ytm-watch > ytm-single-column-watch-next-results-renderer > ytm-slim-video-metadata-section-renderer > ytm-slim-video-action-bar-renderer > div > ytm-slim-metadata-toggle-button-renderer:nth-child(1)"
|
||||
"#app > div.page-container > ytm-watch > ytm-single-column-watch-next-results-renderer > ytm-slim-video-metadata-section-renderer > ytm-slim-video-action-bar-renderer > div > ytm-slim-metadata-toggle-button-renderer:nth-child(1)",
|
||||
);
|
||||
} else {
|
||||
YTLikeButton = document.querySelector(
|
||||
"#top-level-buttons-computed > ytd-toggle-button-renderer:nth-child(1)"
|
||||
"#top-level-buttons-computed > ytd-toggle-button-renderer:nth-child(1)",
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+133
-108
@@ -1,10 +1,4 @@
|
||||
import {
|
||||
getLikeButton,
|
||||
getDislikeButton,
|
||||
getButtons,
|
||||
getLikeTextContainer,
|
||||
getDislikeTextContainer,
|
||||
} from "./buttons";
|
||||
import { getLikeButton, getDislikeButton, getButtons, getLikeTextContainer, getDislikeTextContainer } from "./buttons";
|
||||
import { createRateBar } from "./bar";
|
||||
import {
|
||||
getBrowser,
|
||||
@@ -12,9 +6,10 @@ import {
|
||||
cLog,
|
||||
numberFormat,
|
||||
getColorFromTheme,
|
||||
querySelector,
|
||||
localize,
|
||||
createObserver,
|
||||
} 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";
|
||||
@@ -24,6 +19,7 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
|
||||
|
||||
let extConfig = {
|
||||
disableVoteSubmission: false,
|
||||
disableLogging: false,
|
||||
coloredThumbs: false,
|
||||
coloredBar: false,
|
||||
colorTheme: "classic",
|
||||
@@ -31,6 +27,33 @@ let extConfig = {
|
||||
showTooltipPercentage: false,
|
||||
tooltipPercentageMode: "dash_like",
|
||||
numberDisplayReformatLikes: false,
|
||||
selectors: {
|
||||
dislikeTextContainer: [],
|
||||
likeTextContainer: [],
|
||||
buttons: {
|
||||
shorts: {
|
||||
mobile: [],
|
||||
desktop: [],
|
||||
},
|
||||
regular: {
|
||||
mobile: [],
|
||||
desktopMenu: [],
|
||||
desktopNoMenu: [],
|
||||
},
|
||||
likeButton: {
|
||||
segmented: [],
|
||||
segmentedGetButtons: [],
|
||||
notSegmented: [],
|
||||
},
|
||||
dislikeButton: {
|
||||
segmented: [],
|
||||
segmentedGetButtons: [],
|
||||
notSegmented: [],
|
||||
},
|
||||
},
|
||||
menuContainer: [],
|
||||
roundedDesign: [],
|
||||
},
|
||||
};
|
||||
|
||||
let storedData = {
|
||||
@@ -52,73 +75,67 @@ function isNewDesign() {
|
||||
}
|
||||
|
||||
function isRoundedDesign() {
|
||||
return document.getElementById("segmented-like-button") !== null;
|
||||
return querySelector(extConfig.selectors.roundedDesign) !== null;
|
||||
}
|
||||
|
||||
let mutationObserver = new Object();
|
||||
let shortsObserver = null;
|
||||
|
||||
if (isShorts() && mutationObserver.exists !== true) {
|
||||
cLog("initializing mutation observer");
|
||||
mutationObserver.options = {
|
||||
childList: false,
|
||||
attributes: true,
|
||||
subtree: false,
|
||||
};
|
||||
mutationObserver.exists = true;
|
||||
mutationObserver.observer = new MutationObserver(function (
|
||||
mutationList,
|
||||
observer
|
||||
) {
|
||||
mutationList.forEach((mutation) => {
|
||||
if (
|
||||
mutation.type === "attributes" &&
|
||||
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
||||
mutation.target.id === "button"
|
||||
) {
|
||||
// cLog('Short thumb button status changed');
|
||||
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
||||
mutation.target.style.color =
|
||||
mutation.target.parentElement.parentElement.id === "like-button"
|
||||
? getColorFromTheme(true)
|
||||
: getColorFromTheme(false);
|
||||
} else {
|
||||
mutation.target.style.color = "unset";
|
||||
if (isShorts() && !shortsObserver) {
|
||||
cLog("Initializing shorts mutation observer");
|
||||
shortsObserver = createObserver(
|
||||
{
|
||||
attributes: true,
|
||||
},
|
||||
(mutationList) => {
|
||||
mutationList.forEach((mutation) => {
|
||||
if (
|
||||
mutation.type === "attributes" &&
|
||||
mutation.target.nodeName === "TP-YT-PAPER-BUTTON" &&
|
||||
mutation.target.id === "button"
|
||||
) {
|
||||
// cLog('Short thumb button status changed');
|
||||
if (mutation.target.getAttribute("aria-pressed") === "true") {
|
||||
mutation.target.style.color =
|
||||
mutation.target.parentElement.parentElement.id === "like-button"
|
||||
? getColorFromTheme(true)
|
||||
: getColorFromTheme(false);
|
||||
} else {
|
||||
mutation.target.style.color = "unset";
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
cLog(
|
||||
"unexpected mutation observer event: " + mutation.target + mutation.type
|
||||
);
|
||||
});
|
||||
});
|
||||
cLog("Unexpected mutation observer event: " + mutation.target + mutation.type);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
function isLikesDisabled() {
|
||||
// return true if the like button's text doesn't contain any number
|
||||
if (isMobile()) {
|
||||
return /^\D*$/.test(
|
||||
getButtons().children[0].querySelector(".button-renderer-text").innerText
|
||||
);
|
||||
return /^\D*$/.test(getButtons().children[0].querySelector(".button-renderer-text").innerText);
|
||||
}
|
||||
return /^\D*$/.test(getButtons().children[0].innerText);
|
||||
return /^\D*$/.test(getLikeTextContainer().innerText);
|
||||
}
|
||||
|
||||
function isVideoLiked() {
|
||||
if (isMobile()) {
|
||||
return (
|
||||
getLikeButton().querySelector("button").getAttribute("aria-label") === "true"
|
||||
);
|
||||
return getLikeButton().querySelector("button").getAttribute("aria-label") === "true";
|
||||
}
|
||||
return getLikeButton().classList.contains("style-default-active") || getLikeButton().querySelector('button')?.getAttribute('aria-pressed') === 'true';
|
||||
return (
|
||||
getLikeButton().classList.contains("style-default-active") ||
|
||||
getLikeButton().querySelector("button")?.getAttribute("aria-pressed") === "true"
|
||||
);
|
||||
}
|
||||
|
||||
function isVideoDisliked() {
|
||||
if (isMobile()) {
|
||||
return (
|
||||
getDislikeButton().querySelector("button").getAttribute("aria-label") === "true"
|
||||
);
|
||||
return getDislikeButton().querySelector("button").getAttribute("aria-label") === "true";
|
||||
}
|
||||
return getDislikeButton().classList.contains("style-default-active") || getDislikeButton().querySelector('button')?.getAttribute('aria-pressed') === 'true';
|
||||
return (
|
||||
getDislikeButton().classList.contains("style-default-active") ||
|
||||
getDislikeButton().querySelector("button")?.getAttribute("aria-pressed") === "true"
|
||||
);
|
||||
}
|
||||
|
||||
function getState(storedData) {
|
||||
@@ -133,32 +150,34 @@ function getState(storedData) {
|
||||
|
||||
//--- Sets The Likes And Dislikes Values ---//
|
||||
function setLikes(likesCount) {
|
||||
cLog(`SET likes ${likesCount}`)
|
||||
cLog(`SET likes ${likesCount}`);
|
||||
getLikeTextContainer().innerText = likesCount;
|
||||
}
|
||||
|
||||
function setDislikes(dislikesCount) {
|
||||
cLog(`SET dislikes ${dislikesCount}`)
|
||||
getDislikeTextContainer()?.removeAttribute("is-empty");
|
||||
getDislikeTextContainer()?.removeAttribute('is-empty');
|
||||
cLog(`SET dislikes ${dislikesCount}`);
|
||||
|
||||
const _container = getDislikeTextContainer();
|
||||
_container?.removeAttribute("is-empty");
|
||||
|
||||
let _dislikeText
|
||||
if (!isLikesDisabled()) {
|
||||
if (isMobile()) {
|
||||
getButtons().children[1].querySelector(
|
||||
".button-renderer-text"
|
||||
).innerText = dislikesCount;
|
||||
getButtons().children[1].querySelector(".button-renderer-text").innerText = dislikesCount;
|
||||
return;
|
||||
}
|
||||
getDislikeTextContainer().innerText = dislikesCount;
|
||||
|
||||
_dislikeText = dislikesCount;
|
||||
} else {
|
||||
cLog("likes count disabled by creator");
|
||||
if (isMobile()) {
|
||||
getButtons().children[1].querySelector(
|
||||
".button-renderer-text"
|
||||
).innerText = localize("TextLikesDisabled");
|
||||
getButtons().children[1].querySelector(".button-renderer-text").innerText = localize("TextLikesDisabled");
|
||||
return;
|
||||
}
|
||||
getDislikeTextContainer().innerText = localize("TextLikesDisabled");
|
||||
_dislikeText = localize("TextLikesDisabled");
|
||||
}
|
||||
|
||||
if (_dislikeText != null && _container?.innerText !== _dislikeText) {
|
||||
_container.innerText = _dislikeText;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,12 +189,10 @@ function getLikeCountFromButton() {
|
||||
return false;
|
||||
}
|
||||
|
||||
let likeButton = getLikeButton()
|
||||
.querySelector("yt-formatted-string#text") ??
|
||||
getLikeButton().querySelector("button");
|
||||
let likeButton =
|
||||
getLikeButton().querySelector("yt-formatted-string#text") ?? getLikeButton().querySelector("button");
|
||||
|
||||
let likesStr = likeButton.getAttribute("aria-label")
|
||||
.replace(/\D/g, "");
|
||||
let likesStr = likeButton.getAttribute("aria-label").replace(/\D/g, "");
|
||||
return likesStr.length > 0 ? parseInt(likesStr) : false;
|
||||
} catch {
|
||||
return false;
|
||||
@@ -197,26 +214,16 @@ function processResponse(response, storedData) {
|
||||
if (extConfig.coloredThumbs === true) {
|
||||
if (isShorts()) {
|
||||
// for shorts, leave deactivated buttons in default color
|
||||
let shortLikeButton = getLikeButton().querySelector(
|
||||
"tp-yt-paper-button#button"
|
||||
);
|
||||
let shortDislikeButton = getDislikeButton().querySelector(
|
||||
"tp-yt-paper-button#button"
|
||||
);
|
||||
let shortLikeButton = getLikeButton().querySelector("tp-yt-paper-button#button");
|
||||
let shortDislikeButton = getDislikeButton().querySelector("tp-yt-paper-button#button");
|
||||
if (shortLikeButton.getAttribute("aria-pressed") === "true") {
|
||||
shortLikeButton.style.color = getColorFromTheme(true);
|
||||
}
|
||||
if (shortDislikeButton.getAttribute("aria-pressed") === "true") {
|
||||
shortDislikeButton.style.color = getColorFromTheme(false);
|
||||
}
|
||||
mutationObserver.observer.observe(
|
||||
shortLikeButton,
|
||||
mutationObserver.options
|
||||
);
|
||||
mutationObserver.observer.observe(
|
||||
shortDislikeButton,
|
||||
mutationObserver.options
|
||||
);
|
||||
shortsObserver.observe(shortLikeButton);
|
||||
shortsObserver.observe(shortDislikeButton);
|
||||
} else {
|
||||
getLikeButton().style.color = getColorFromTheme(true);
|
||||
getDislikeButton().style.color = getColorFromTheme(false);
|
||||
@@ -228,31 +235,23 @@ function processResponse(response, storedData) {
|
||||
|
||||
// Tells the user if the API is down
|
||||
function displayError(error) {
|
||||
getDislikeTextContainer().innerText = localize(
|
||||
"textTempUnavailable"
|
||||
);
|
||||
getDislikeTextContainer().innerText = localize("textTempUnavailable");
|
||||
}
|
||||
|
||||
async function setState(storedData) {
|
||||
storedData.previousState = isVideoDisliked()
|
||||
? DISLIKED_STATE
|
||||
: isVideoLiked()
|
||||
? LIKED_STATE
|
||||
: NEUTRAL_STATE;
|
||||
storedData.previousState = isVideoDisliked() ? DISLIKED_STATE : isVideoLiked() ? LIKED_STATE : NEUTRAL_STATE;
|
||||
let statsSet = false;
|
||||
cLog("Video is loaded. Adding buttons...");
|
||||
|
||||
let videoId = getVideoId(window.location.href);
|
||||
let likeCount = getLikeCountFromButton() || null;
|
||||
|
||||
let response = await fetch(
|
||||
`${apiUrl}/votes?videoId=${videoId}&likeCount=${likeCount || ""}`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
}
|
||||
)
|
||||
let response = await fetch(`${apiUrl}/votes?videoId=${videoId}&likeCount=${likeCount || ""}`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok) displayError(response.error);
|
||||
return response;
|
||||
@@ -266,12 +265,13 @@ async function setState(storedData) {
|
||||
}
|
||||
}
|
||||
|
||||
function setInitialState() {
|
||||
setState(storedData);
|
||||
async function setInitialState() {
|
||||
await setState(storedData);
|
||||
}
|
||||
|
||||
function initExtConfig() {
|
||||
async function initExtConfig() {
|
||||
initializeDisableVoteSubmission();
|
||||
initializeDisableLogging();
|
||||
initializeColoredThumbs();
|
||||
initializeColoredBar();
|
||||
initializeColorTheme();
|
||||
@@ -279,6 +279,21 @@ function initExtConfig() {
|
||||
initializeTooltipPercentage();
|
||||
initializeTooltipPercentageMode();
|
||||
initializeNumberDisplayReformatLikes();
|
||||
await initializeSelectors();
|
||||
}
|
||||
|
||||
async function initializeSelectors() {
|
||||
console.log("initializing selectors");
|
||||
let result = await fetch(`${apiUrl}/configs/selectors`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.catch((error) => {});
|
||||
extConfig.selectors = result ?? extConfig.selectors;
|
||||
console.log(result);
|
||||
}
|
||||
|
||||
function initializeDisableVoteSubmission() {
|
||||
@@ -291,6 +306,16 @@ function initializeDisableVoteSubmission() {
|
||||
});
|
||||
}
|
||||
|
||||
function initializeDisableLogging() {
|
||||
getBrowser().storage.sync.get(["disableLogging"], (res) => {
|
||||
if (res.disableLogging === undefined) {
|
||||
getBrowser().storage.sync.set({ disableLogging: true });
|
||||
} else {
|
||||
extConfig.disableLogging = res.disableLogging;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initializeColoredThumbs() {
|
||||
getBrowser().storage.sync.get(["coloredThumbs"], (res) => {
|
||||
if (res.coloredThumbs === undefined) {
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import { extConfig } from "./state";
|
||||
|
||||
function numberFormat(numberState) {
|
||||
return getNumberFormatter(extConfig.numberDisplayFormat).format(
|
||||
numberState
|
||||
);
|
||||
return getNumberFormatter(extConfig.numberDisplayFormat).format(numberState);
|
||||
}
|
||||
|
||||
function getNumberFormatter(optionSelect) {
|
||||
@@ -17,12 +15,10 @@ function getNumberFormatter(optionSelect) {
|
||||
userLocales = new URL(
|
||||
Array.from(document.querySelectorAll("head > link[rel='search']"))
|
||||
?.find((n) => n?.getAttribute("href")?.includes("?locale="))
|
||||
?.getAttribute("href")
|
||||
?.getAttribute("href"),
|
||||
)?.searchParams?.get("locale");
|
||||
} catch {
|
||||
cLog(
|
||||
"Cannot find browser locale. Use en as default for number formatting."
|
||||
);
|
||||
cLog("Cannot find browser locale. Use en as default for number formatting.");
|
||||
userLocales = "en";
|
||||
}
|
||||
}
|
||||
@@ -58,10 +54,7 @@ function localize(localeString) {
|
||||
function getBrowser() {
|
||||
if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined") {
|
||||
return chrome;
|
||||
} else if (
|
||||
typeof browser !== "undefined" &&
|
||||
typeof browser.runtime !== "undefined"
|
||||
) {
|
||||
} else if (typeof browser !== "undefined" && typeof browser.runtime !== "undefined") {
|
||||
return browser;
|
||||
} else {
|
||||
console.log("browser is not supported");
|
||||
@@ -73,7 +66,8 @@ function getVideoId(url) {
|
||||
const urlObject = new URL(url);
|
||||
const pathname = urlObject.pathname;
|
||||
if (pathname.startsWith("/clip")) {
|
||||
return document.querySelector("meta[itemprop='videoId']").content;
|
||||
return (document.querySelector("meta[itemprop='videoId']") || document.querySelector("meta[itemprop='identifier']"))
|
||||
.content;
|
||||
} else {
|
||||
if (pathname.startsWith("/shorts")) {
|
||||
return pathname.slice(8);
|
||||
@@ -100,6 +94,9 @@ function isInViewport(element) {
|
||||
function isVideoLoaded() {
|
||||
const videoId = getVideoId(window.location.href);
|
||||
return (
|
||||
// desktop: spring 2024 UI
|
||||
document.querySelector(`ytd-watch-grid[video-id='${videoId}']`) !== null ||
|
||||
// desktop: older UI
|
||||
document.querySelector(`ytd-watch-flexy[video-id='${videoId}']`) !== null ||
|
||||
// mobile: no video-id attribute
|
||||
document.querySelector('#player[loading="false"]:not([hidden])') !== null
|
||||
@@ -107,11 +104,13 @@ function isVideoLoaded() {
|
||||
}
|
||||
|
||||
function cLog(message, writer) {
|
||||
message = `[return youtube dislike]: ${message}`;
|
||||
if (writer) {
|
||||
writer(message);
|
||||
} else {
|
||||
console.log(message);
|
||||
if (!extConfig.disableLogging) {
|
||||
message = `[return youtube dislike]: ${message}`;
|
||||
if (writer) {
|
||||
writer(message);
|
||||
} else {
|
||||
console.log(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,8 +142,43 @@ function getColorFromTheme(voteIsLike) {
|
||||
return colorString;
|
||||
}
|
||||
|
||||
function querySelector(selectors, element) {
|
||||
let result;
|
||||
for (const selector of selectors) {
|
||||
result = (element ?? document).querySelector(selector);
|
||||
if (result !== null) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function querySelectorAll(selectors) {
|
||||
let result;
|
||||
for (const selector of selectors) {
|
||||
result = document.querySelectorAll(selector);
|
||||
if (result.length !== 0) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function createObserver(options, callback) {
|
||||
const observerWrapper = new Object();
|
||||
observerWrapper.options = options;
|
||||
observerWrapper.observer = new MutationObserver(callback);
|
||||
observerWrapper.observe = function (element) {
|
||||
this.observer.observe(element, this.options);
|
||||
};
|
||||
observerWrapper.disconnect = function () {
|
||||
this.observer.disconnect();
|
||||
};
|
||||
return observerWrapper;
|
||||
}
|
||||
|
||||
export {
|
||||
numberFormat,
|
||||
getNumberFormatter,
|
||||
getBrowser,
|
||||
getVideoId,
|
||||
isInViewport,
|
||||
@@ -152,4 +186,7 @@ export {
|
||||
cLog,
|
||||
getColorFromTheme,
|
||||
localize,
|
||||
querySelector,
|
||||
querySelectorAll,
|
||||
createObserver,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,325 @@
|
||||
/**
|
||||
* @jest-environment jsdom
|
||||
*/
|
||||
|
||||
import {
|
||||
__Rewire__ as rewiredUtils,
|
||||
numberFormat,
|
||||
getNumberFormatter,
|
||||
localize,
|
||||
getBrowser,
|
||||
getVideoId,
|
||||
isInViewport,
|
||||
isVideoLoaded,
|
||||
cLog,
|
||||
getColorFromTheme,
|
||||
} from "./utils";
|
||||
import { extConfig } from "./state";
|
||||
|
||||
jest.mock("./state");
|
||||
|
||||
describe("numberFormat", () => {
|
||||
it("should format high numbers correctly", () => {
|
||||
rewiredUtils(
|
||||
"getNumberFormatter",
|
||||
jest.fn().mockReturnValue(
|
||||
Intl.NumberFormat("en", {
|
||||
notation: "compact",
|
||||
compactDisplay: "short",
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
expect(numberFormat(91492)).toBe("91K");
|
||||
jest.resetAllMocks();
|
||||
});
|
||||
|
||||
it("should not format input when < 1000", () => {
|
||||
rewiredUtils(
|
||||
"getNumberFormatter",
|
||||
jest.fn().mockReturnValue(
|
||||
Intl.NumberFormat("en", {
|
||||
notation: "compact",
|
||||
compactDisplay: "short",
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
expect(numberFormat(100)).toBe("100");
|
||||
});
|
||||
|
||||
it("should not round down when rounding is diabled in config", () => {
|
||||
rewiredUtils(
|
||||
"getNumberFormatter",
|
||||
jest.fn().mockReturnValue(
|
||||
Intl.NumberFormat("de", {
|
||||
notation: "compact",
|
||||
compactDisplay: "short",
|
||||
}),
|
||||
),
|
||||
);
|
||||
extConfig.numberDisplayRoundDown = false;
|
||||
|
||||
expect(numberFormat(912391)).toBe("912.391");
|
||||
});
|
||||
});
|
||||
|
||||
describe("getNumberFormatter", () => {
|
||||
it("should return a correct formatter with compactLong option", () => {
|
||||
expect(getNumberFormatter("compactLong")).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should return a correct formatter whith standard option", () => {
|
||||
expect(getNumberFormatter("standard")).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should return a correct formatter when using chrome", () => {
|
||||
Object.defineProperty(document.documentElement, "lang", {
|
||||
value: "en",
|
||||
configurable: true,
|
||||
});
|
||||
expect(getNumberFormatter()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should return a correct formatter when using firefox", () => {
|
||||
Object.defineProperty(document.documentElement, "lang", {
|
||||
value: null,
|
||||
configurable: true,
|
||||
});
|
||||
expect(getNumberFormatter()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should return a correct formatter when using the URL locale (possibly buggy)", () => {
|
||||
// Disclaimer: The case we are testing here is actually not correct and
|
||||
// am almost sure I found a bug in the actual implementation of
|
||||
// getNumberFormatter(). As I am currently writing acceptance tests only
|
||||
// e.g. tests that are exclusively testing the current behaviour as is, as
|
||||
// a first step of adding tests to the codebase, I will add it like this
|
||||
// for now and document how we should actually be testing down below.
|
||||
// The reason why this bug is not causing faulty behaviour is, that we
|
||||
// have a fallback for it, that is always triggered.
|
||||
|
||||
// This is how we make the test go green:
|
||||
Object.defineProperty(document.documentElement, "lang", {
|
||||
value: null,
|
||||
configurable: true,
|
||||
});
|
||||
Object.defineProperty(navigator, "language", {
|
||||
value: null,
|
||||
configurable: true,
|
||||
});
|
||||
const mockedNode = document.createElement("link");
|
||||
|
||||
mockedNode.setAttribute("href", "https://www.youtube.com/opensearch?locale=en");
|
||||
|
||||
document.querySelectorAll = jest.fn().mockReturnValue([mockedNode]);
|
||||
expect(getNumberFormatter()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it.skip("should return a correct formatter when using the URL locale", () => {
|
||||
// But we actually want to test like so, which is the correct value of the locale attribute:
|
||||
Object.defineProperty(document.documentElement, "lang", {
|
||||
value: null,
|
||||
configurable: true,
|
||||
});
|
||||
Object.defineProperty(navigator, "language", {
|
||||
value: null,
|
||||
configurable: true,
|
||||
});
|
||||
const mockedNode = document.createElement("link");
|
||||
mockedNode.setAttribute("href", "https://www.youtube.com/opensearch?locale=en_US");
|
||||
|
||||
document.querySelectorAll = jest.fn().mockReturnValue([mockedNode]);
|
||||
expect(getNumberFormatter()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("should return a correct formatter when falling back to default locale", () => {
|
||||
Object.defineProperty(document.documentElement, "lang", {
|
||||
value: null,
|
||||
configurable: true,
|
||||
});
|
||||
Object.defineProperty(navigator, "language", {
|
||||
value: null,
|
||||
configurable: true,
|
||||
});
|
||||
expect(getNumberFormatter()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
describe("localize", () => {
|
||||
it("should return a translated string", () => {
|
||||
global.chrome = {
|
||||
i18n: {
|
||||
getMessage: () => "Return YouTube Dislike",
|
||||
},
|
||||
};
|
||||
expect(localize("extensionName")).toBe("Return YouTube Dislike");
|
||||
});
|
||||
});
|
||||
|
||||
describe("getBrowser", () => {
|
||||
it("should return a chrome browser instance", () => {
|
||||
global.chrome = {
|
||||
runtime: jest.fn(),
|
||||
};
|
||||
expect(getBrowser()).toBeDefined();
|
||||
});
|
||||
|
||||
it("should return a mozilla browser instance", () => {
|
||||
global.chrome.runtime = undefined;
|
||||
global.browser = {
|
||||
runtime: jest.fn(),
|
||||
};
|
||||
expect(getBrowser()).toBeDefined();
|
||||
});
|
||||
|
||||
it("should fail on unsupported browser", () => {
|
||||
global.chrome = undefined;
|
||||
global.browser = undefined;
|
||||
|
||||
const log = console.log;
|
||||
console.log = jest.fn();
|
||||
|
||||
expect(getBrowser()).toBe(false);
|
||||
expect(console.log).toBeCalledWith("browser is not supported");
|
||||
|
||||
console.log = log;
|
||||
});
|
||||
});
|
||||
describe("getVideoId", () => {
|
||||
it("should return the video Id on valid url input", () => {
|
||||
const url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
|
||||
expect(getVideoId(url)).toBe("dQw4w9WgXcQ");
|
||||
});
|
||||
|
||||
it("should return the video Id on valid shorts url input", () => {
|
||||
const url = "https://www.youtube.com/shorts/niMcQ9Vmmj8";
|
||||
expect(getVideoId(url)).toBe("niMcQ9Vmmj8");
|
||||
});
|
||||
|
||||
it("should return the video Id on clip url input", () => {
|
||||
document.querySelector = jest.fn().mockReturnValue({
|
||||
content: "niMcQ9Vmmj8",
|
||||
});
|
||||
const url = "https://www.youtube.com/clip";
|
||||
expect(getVideoId(url)).toBe("niMcQ9Vmmj8");
|
||||
});
|
||||
|
||||
it("should return null on invalid url input", () => {
|
||||
const url = "https://www.youtube.com/wrong-url";
|
||||
expect(getVideoId(url)).toBe(null);
|
||||
});
|
||||
});
|
||||
describe("isInViewport", () => {
|
||||
it("should return true if element is in viewport", () => {
|
||||
const rect = {
|
||||
getBoundingClientRect: jest.fn().mockReturnValue({
|
||||
top: 0,
|
||||
left: 0,
|
||||
bottom: 0,
|
||||
right: 0,
|
||||
}),
|
||||
};
|
||||
expect(isInViewport(rect)).toBe(false);
|
||||
});
|
||||
|
||||
it("should return false if element is out of viewport", () => {
|
||||
const rect = {
|
||||
getBoundingClientRect: jest.fn().mockReturnValue({
|
||||
top: 0,
|
||||
left: 0,
|
||||
bottom: 769,
|
||||
right: 0,
|
||||
}),
|
||||
};
|
||||
expect(isInViewport(rect)).toBe(false);
|
||||
});
|
||||
});
|
||||
describe("isVideoLoaded", () => {
|
||||
describe("on desktop", () => {
|
||||
it("should return true on loaded video", () => {
|
||||
rewiredUtils("getVideoId", jest.fn().mockReturnValue("fakeId"));
|
||||
document.querySelector = jest.fn().mockReturnValue("notNull");
|
||||
expect(isVideoLoaded()).toBe(true);
|
||||
expect(document.querySelector).toBeCalledWith("ytd-watch-grid[video-id='fakeId']");
|
||||
});
|
||||
|
||||
it("should return false on not loaded video", () => {
|
||||
rewiredUtils("getVideoId", jest.fn().mockReturnValue("fakeId"));
|
||||
document.querySelector = jest.fn().mockReturnValue(null);
|
||||
expect(isVideoLoaded()).toBe(false);
|
||||
expect(document.querySelector).toBeCalledWith("ytd-watch-flexy[video-id='fakeId']");
|
||||
});
|
||||
});
|
||||
|
||||
describe("on mobile", () => {
|
||||
it("should return true on loaded video", () => {
|
||||
rewiredUtils("getVideoId", jest.fn().mockReturnValue("fakeId"));
|
||||
document.querySelector = jest.fn().mockReturnValueOnce(null).mockReturnValue("notNull");
|
||||
expect(isVideoLoaded()).toBe(true);
|
||||
expect(document.querySelector).toHaveBeenLastCalledWith("ytd-watch-flexy[video-id='fakeId']");
|
||||
});
|
||||
|
||||
it("should return false on not loaded video", () => {
|
||||
rewiredUtils("getVideoId", jest.fn().mockReturnValue("fakeId"));
|
||||
document.querySelector = jest.fn().mockReturnValueOnce(null).mockReturnValue(null);
|
||||
expect(isVideoLoaded()).toBe(false);
|
||||
expect(document.querySelector).toHaveBeenLastCalledWith('#player[loading="false"]:not([hidden])');
|
||||
});
|
||||
});
|
||||
});
|
||||
describe("cLog", () => {
|
||||
it("should log a message with the correct prefix", () => {
|
||||
const log = console.log;
|
||||
console.log = jest.fn();
|
||||
cLog("Test message");
|
||||
|
||||
expect(console.log).toBeCalledWith("[return youtube dislike]: Test message");
|
||||
|
||||
console.log = log;
|
||||
});
|
||||
|
||||
it("should log a message with the correct prefix when given a writer", () => {
|
||||
const fakeWriter = jest.fn();
|
||||
|
||||
cLog("Test message", fakeWriter);
|
||||
expect(fakeWriter).toBeCalledWith("[return youtube dislike]: Test message");
|
||||
});
|
||||
});
|
||||
describe("getColorFromTheme", () => {
|
||||
describe("accessible", () => {
|
||||
it("should return the correct color for like", () => {
|
||||
extConfig.colorTheme = "accessible";
|
||||
expect(getColorFromTheme(true)).toBe("dodgerblue");
|
||||
});
|
||||
|
||||
it("should return the correct color for not liked", () => {
|
||||
extConfig.colorTheme = "accessible";
|
||||
expect(getColorFromTheme(false)).toBe("gold");
|
||||
});
|
||||
});
|
||||
|
||||
describe("neon", () => {
|
||||
it("should return the correct color for like", () => {
|
||||
extConfig.colorTheme = "neon";
|
||||
expect(getColorFromTheme(true)).toBe("aqua");
|
||||
});
|
||||
|
||||
it("should return the correct color for not liked", () => {
|
||||
extConfig.colorTheme = "neon";
|
||||
expect(getColorFromTheme(false)).toBe("magenta");
|
||||
});
|
||||
});
|
||||
|
||||
describe("classic", () => {
|
||||
it("should return the correct color for like", () => {
|
||||
extConfig.colorTheme = "classic";
|
||||
expect(getColorFromTheme(true)).toBe("lime");
|
||||
});
|
||||
|
||||
it("should return the correct color for not liked", () => {
|
||||
extConfig.colorTheme = "classic";
|
||||
expect(getColorFromTheme(false)).toBe("red");
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,9 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Read this in other languages: [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
|
||||
Read this in other languages: [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Português do Brasil](READMEpt_BR.md), [Magyar](READMEhu.md), [Danish](READMEda.md)
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
@@ -40,7 +38,7 @@ You can learn more at our website at: [returnyoutubedislike.com](https://www.ret
|
||||
Third-party use of this open API is allowed with the following restrictions:
|
||||
|
||||
- **Attribution**: This project should be clearly attributed with a link to [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Rate Limiting**: There are per client rate limits in place of 100 per minute and 10'000 per day. This will return a _429_ status code indicating that your application should back off.
|
||||
- **Rate Limiting**: There are per client rate limits in place of 100 per minute and 10,000 per day. This will return a _429_ status code indicating that your application should back off.
|
||||
|
||||
The API is accessible over the following base URL:
|
||||
https://returnyoutubedislikeapi.com
|
||||
@@ -65,7 +63,7 @@ Example to get votes of a given YouTube video ID:
|
||||
}
|
||||
```
|
||||
|
||||
None existing YouTube ID will return status code _404_ "Not Found".
|
||||
Non-existent YouTube ID will return status code _404_ "Not Found".
|
||||
Wrong formed YouTube ID will return _400_ "Bad Request".
|
||||
|
||||
<!---
|
||||
@@ -86,10 +84,6 @@ You can support this project by donating to us on the link below:
|
||||
|
||||
## Sponsors
|
||||
|
||||
[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)
|
||||
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
阅读其他语言版本:[English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
<b>Return YouTube Dislike是一个开源的扩展,可以显示 YouTube 的不喜欢数量。</b><br>
|
||||
适用于 Chrome 和 Firefox 作为 Web 扩展。<br>
|
||||
也可以作为 JS Userscript 在其他浏览器上使用。<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
|
||||
## 故事
|
||||
|
||||
在2021年11月10日,Google [宣布](https://blog.youtube/news-and-events/update-to-youtube/) 将移除 YouTube 的不喜欢数量。
|
||||
|
||||
此外,YouTube API 中的 `dislike` 字段于2021年12月13日 [被移除](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts),移除了在观看之前评估内容质量的能力。
|
||||
|
||||
## 它是如何工作的
|
||||
|
||||
随着 YouTube API 中不喜欢统计信息的移除,我们的后端切换到使用从扩展用户数据中抓取的不喜欢统计信息和估算数据的组合。
|
||||
|
||||
[常见问题解答](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/) 的链接。
|
||||
- **速率限制**: 客户端的速率限制为每分钟100次和每天10,000次。这将返回 _429_ 状态代码,表示您的应用程序应该减速。
|
||||
|
||||
API 可以通过以下基本 URL 访问:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
可用端点列表在这里:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### 获取投票
|
||||
|
||||
示例获取给定 YouTube 视频 ID 的投票:
|
||||
`/votes?videoId=kxOuG8jMIgI`
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "kxOuG8jMIgI",
|
||||
"dateCreated": "2021-12-20T12:25:54.418014Z",
|
||||
"likes": 27326,
|
||||
"dislikes": 498153,
|
||||
"rating": 1.212014408444885,
|
||||
"viewCount": 3149885,
|
||||
"deleted": false
|
||||
}
|
||||
```
|
||||
|
||||
不存在的 YouTube ID 将返回状态码 _404_ "未找到"。
|
||||
格式错误的 YouTube ID 将返回 _400_ "请求无效"。
|
||||
|
||||
## 贡献
|
||||
|
||||
请阅读[贡献指南](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=return
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Læs dette på andre sprog: [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md)
|
||||
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
<b>Return YouTube Dislike er en open-source udvidelse, som bringer antallet af dislikes tilbage på YouTube.</b><br>
|
||||
Den er tilgængelig til Chrome og Firefox som en webudvidelse.<br>
|
||||
Den er også tilgængelig i andre browsere som et JS Userscript.<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
|
||||
## Historien
|
||||
|
||||
Den 10. november 2021, [annoncerede Google](https://blog.youtube/news-and-events/update-to-youtube/) at Youtube dislike tælleren ville blive fjernet.
|
||||
|
||||
Desuden blev dislike-feltet i YouTube API'en [fjernet](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) den 13. december 2021, 2021, hvilket fjernede muligheden til at vurdere kvaliteten af indholdet før afspilning.
|
||||
|
||||
## Hvad den gør
|
||||
|
||||
Med fjernelsen af dislike stats fra Youtube API'en, har vores backend skiftet til at bruge en kombination af scraped dislike-statistic, hvor skøn er extrapoleret fra extension-brugerdata.
|
||||
|
||||
[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
|
||||
## Hvorfor det betyder noget
|
||||
|
||||
Du kan lære mere på vores hjemmeside: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## API dokumentation
|
||||
|
||||
Tredjeparts brug af denne åbne API er tilladt under de følgende restriktioner:
|
||||
|
||||
- **Tilskrivning**: Dette projekt skal tydeligt tilskrives med et link til [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Rategrænse**: Der er en grænse på 100 anmodninger per minut og 10.000 per dag for hver klient. Dette vil returnere en statuskode på _429_, som indikerer, at din applikation skal trække sig tilbage.
|
||||
|
||||
API'en er tilgængelig via følgende base-URL:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
En liste over tilgængelige endpoints er tilgængelig her:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Få stemmer
|
||||
|
||||
Eksempel på at få stemmer på en given 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
|
||||
}
|
||||
```
|
||||
|
||||
En ikke-eksisterende YouTube-ID vil returnere statuskoden _404_ "Not Found".
|
||||
En forkert formet YouTube-ID vil returnere _400_ "Bad Request".
|
||||
|
||||
<!---
|
||||
## API documentation
|
||||
|
||||
Du kan se al dokumentation på vores hjemmeside.
|
||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||
|
||||
## Bidrag
|
||||
|
||||
Læs venligst [bidragsvejledningen](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
|
||||
|
||||
## Støt dette projekt!
|
||||
|
||||
Du kan støtte dette projekt ved at donere til os på nedenstående link:
|
||||
|
||||
[Doner](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## Sponsorer
|
||||
|
||||
[Piepacker](https://piepacker.com)
|
||||
|
||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||
|
||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||
|
||||
[Bliv vores sponsor](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
+4
-8
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,13 +7,13 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Lesen sie dies in anderen Sprachen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Ελληνικά](READMEgr.md)
|
||||
Lesen sie dies in anderen Sprachen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Danish](READMEda.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
<b>Return YouTube Dislike (Bring die YouTube Dislikes zurück) ist eine open-source Erweiterung die den Dislike-Zähler zurückbringt.</b><br>
|
||||
Für <a href="https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/">Chromium Browser</a> und <a href="https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/">Firefox</a> als Browser Erweiterung verfügbar.<br>
|
||||
Für <a href="https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi">Chromium Browser</a> und <a href="https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/">Firefox</a> als Browser Erweiterung verfügbar.<br>
|
||||
Für andere Browsers auch als JS Userscript verfügbar.<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
@@ -85,10 +85,6 @@ Sie können das Projekt unterstützen indem Sie unter den folgenden Link spenden
|
||||
|
||||
## Sponsoren <!-- ## Sponsors -->
|
||||
|
||||
[Piepacker](https://piepacker.com)
|
||||
|
||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||
|
||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||
|
||||
[Werde unser Sponsor](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
|
||||
+3
-4
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,8 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Magyar](READMEhu.md), [Danish](READMEda.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
|
||||
+3
-4
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,8 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](LICENSE)
|
||||
|
||||
Lisez ceci dans d'autres langues : [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md),[日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
Lisez ceci dans d'autres langues : [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md),[日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Danish](READMEda.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
|
||||
+8
-9
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,8 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Διαθέσιμο στις παρακάτω γλώσσες: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md)
|
||||
|
||||
Διαθέσιμο στις παρακάτω γλώσσες: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
@@ -27,7 +26,7 @@
|
||||
|
||||
## Πώς λειτουργεί
|
||||
|
||||
Έπειτα απο την αφάιρεση των στατιστικών dislike απο το YouTube API, το backend μας άλλαξε ώστε να χρησιμοποιεί ένα συνδυασμό συλλογής στατιστικών, και εκτιμήσεων με βάση τα δεδομένα χρήσης της επέκτασης.
|
||||
Έπειτα απο την αφαίρεση των στατιστικών dislike απο το YouTube API, το backend μας άλλαξε ώστε να χρησιμοποιεί ένα συνδυασμό συλλογής στατιστικών, και εκτιμήσεων με βάση τα δεδομένα χρήσης της επέκτασης.
|
||||
|
||||
[Συχνές Ερωτήσεις](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
|
||||
@@ -39,8 +38,8 @@
|
||||
|
||||
Η χρήση απο τρίτους αυτού του ανοιχτού API επιτρέπεται με τους παρακάτω περιορισμούς:
|
||||
|
||||
- **Αναφορά**: Να υπάρχει καθαρή αναφορά στον κώδικα αυτού του έργου με την χρήση του παρακάτω συνδέσμου [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Όριο Χρήσης**: Υπάρχει όριο χρήσης ανα χρήστη το οποίο είναι 100 το λεπτό και 10000 την μέρα. Σε αντίθετη περίπτωση επιστρέφεται μύνημα λάθους _429_ υποδυκνύοντας οτι η εφαρμογή του χρήστη θα πρέπει να περιορίσει την χρήση της.
|
||||
- **Αναφορά**: Να υπάρχει καθαρή αναφορά στον κώδικα αυτού του έργου με τη χρήση του παρακάτω συνδέσμου [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Όριο Χρήσης**: Υπάρχει όριο χρήσης ανα χρήστη το οποίο είναι 100 το λεπτό και 10000 τη μέρα. Σε αντίθετη περίπτωση επιστρέφεται μήνυμα λάθους _429_ υποδεικνύοντας οτι η εφαρμογή του χρήστη θα πρέπει να περιορίσει τη χρήση της.
|
||||
|
||||
Το API είναι διαθέσιμο στον παρακάτω σύνδεσμο:
|
||||
https://returnyoutubedislikeapi.com
|
||||
@@ -66,7 +65,7 @@ https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
```
|
||||
|
||||
Μή διαθέσιμο YouTube ID θα επιστρέψει κωδικό status _404_ "Not Found".
|
||||
Λάνθασμένη δομή YouTube ID θα επιστρέψει _400_ "Bad Request".
|
||||
Λανθασμένη δομή YouTube ID θα επιστρέψει _400_ "Bad Request".
|
||||
|
||||
<!---
|
||||
## API documentation
|
||||
@@ -92,4 +91,4 @@ You can view all documentation on our website.
|
||||
|
||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||
|
||||
[Γίνεται χορηγός μας](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
[Γίνετε χορηγός μας](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Olvasható még a következő nyelveken: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Türkçe](READMEtr.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
<b>A Return YouTube Dislike egy nyílt forráskódú bővítmény, ami visszahozza a YouTube dislike számlálóját.</b><br>
|
||||
Elérhető Chrome és Firefox böngészőkhöz bővítményként, illetve további böngészőkhöz JS Userscript formában.<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
|
||||
## Történet
|
||||
|
||||
2021\. november 10-én a Google [bejelentette](https://blog.youtube/news-and-events/update-to-youtube/), hogy eltávolítják a YouTube dislike ("nem tetszik") számlálóját.
|
||||
|
||||
Ezzel együtt a YouTube API `dislike` mezőjét is [törölték](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 2021. december 13-án, így megszűnt az a lehetőség, hogy a tartalmak megtekintése előtt meggyőződjünk azok minőségéről.
|
||||
|
||||
## Hogyan működik?
|
||||
|
||||
A YouTube API változása utáni dislike statisztikákat a backendünk részben korábban begyűjtött adatokból, részben pedig a bővítményt használók adataiból kinyert becsléssel építi fel.
|
||||
|
||||
[GYIK](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
|
||||
## Miért számít ez?
|
||||
|
||||
Többet is megtudhatsz a weboldalunkon: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## API dokumentáció
|
||||
|
||||
Ennek az API-nak a third-party felhasználását az alábbiak mellett engedélyezzük:
|
||||
|
||||
- **Forrásmegjelölés**: Egy erre a projektre mutató, jól látható [returnyoutubedislike.com](https://returnyoutubedislike.com/) linkkel.
|
||||
- **Rate Limiting**: Kliensoldalon gyakoriság-korlátozás van beállítva percenként 100, naponta maximum 10 000 lekérésre. Túllépés esetén _429_ státuszkód jelzi, hogy az alkalmazásod nem küldhet több lekérést.
|
||||
|
||||
Az API ezen az URL-en érhető el:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
További elérhető endpointok itt találhatók:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Szavazatok lekérése
|
||||
|
||||
Példa egy adott YouTube videó ID adatainak lekéréséhez:
|
||||
`/votes?videoId=kxOuG8jMIgI`
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "kxOuG8jMIgI",
|
||||
"dateCreated": "2021-12-20T12:25:54.418014Z",
|
||||
"likes": 27326,
|
||||
"dislikes": 498153,
|
||||
"rating": 1.212014408444885,
|
||||
"viewCount": 3149885,
|
||||
"deleted": false
|
||||
}
|
||||
```
|
||||
|
||||
Nem létező YouTube ID esetén _404_ "Not Found" státuszkód, rossz formátumú YouTube ID esetén _400_ "Bad Request" válasz érkezik.
|
||||
|
||||
<!---
|
||||
## API dokumentáció
|
||||
|
||||
Az összes dokumentáció elolvasható a weboldalunkon.
|
||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||
|
||||
## Kontribúció
|
||||
|
||||
Kérjük, olvasd el a [kontribúciós leírást](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
|
||||
|
||||
## Támogasd a projektet!
|
||||
|
||||
Támogathatod ezt a projektet adományokkal az alábbi linken:
|
||||
|
||||
[Támogatás](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## Szponzorok
|
||||
|
||||
[Piepacker](https://piepacker.com)
|
||||
|
||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||
|
||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||
|
||||
[Legyél szponzorunk!](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
+3
-4
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,8 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
別の言語: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
別の言語: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Danish](READMEda.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,7 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Lees dit in andere talen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [Ελληνικά](READMEgr.md)
|
||||
Lees dit in andere talen: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Danish](READMEda.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
@@ -44,7 +44,7 @@ Gebruik door derden van deze open API is toegestaan met de volgende beperk
|
||||
De API is toegankelijk via de volgende basis-URL:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
Lijst met beschikbare eindpunten is hier beschikbaar:
|
||||
Lijst met beschikbare eindpunten is hier beschikbaar:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Stemmen krijgen
|
||||
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Read this in other languages: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
<b>Return YouTube Dislike to otwarte rozszerzenie, które przywraca licznik łapek w dół na YouTube.</b><br>
|
||||
Dostępne jako rozszerzenie dla Chrome i Firefox.<br>
|
||||
Dostępne także dla innych przeglądarek jako JS UserScript.<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
|
||||
## Historia
|
||||
|
||||
Dnia 10 listopada 2021, Google [ogłosiło](https://blog.youtube/news-and-events/update-to-youtube/), że licznik łapek w dół na YouTube zostanie usunięty.
|
||||
|
||||
Dodatkowo, pole `dislike` w API YouTube zostało [usunięte](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 grudnia 2021, usuwając przy tym jakąkolwiek możliwość oceny jakości filmu przed obejrzeniem.
|
||||
|
||||
## Co to robi
|
||||
|
||||
Wraz z usunięciem statystyk łapek w dół z YouTube API, nasz backend przełączył się na kombinację scrape-owanych statystyk łapek w dół i szacunków ekstrapolowanych z danych użytkowników rozszerzenia.
|
||||
|
||||
[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
|
||||
## Dlaczego to ma znaczenie
|
||||
|
||||
Można o tym przeczytać na naszej stronie: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## Dokumentacja API
|
||||
|
||||
Używanie tego otwartego API jest dozwolone z następującymi ograniczeniami:
|
||||
|
||||
- **Przypisanie**: Ten projekt powinien być jawnie przypisany z linkiem do [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Ograniczenie żądań**: Istnieją ograniczenia żądań do 100 na minutę i 10 000 na dzień. Przekroczenie zwróci kod _429_, mówiący aplikacji aby przyhamowała.
|
||||
|
||||
API jest dostępne przez poniższe bazowe URL:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
Lista dostępnych endpointów jest dostępna tutaj:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Pobierz głosy
|
||||
|
||||
Przykład otrzymywania głosów z danego ID filmu YouTube:
|
||||
`/votes?videoId=kxOuG8jMIgI`
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "kxOuG8jMIgI",
|
||||
"dateCreated": "2021-12-20T12:25:54.418014Z",
|
||||
"likes": 27326,
|
||||
"dislikes": 498153,
|
||||
"rating": 1.212014408444885,
|
||||
"viewCount": 3149885,
|
||||
"deleted": false
|
||||
}
|
||||
```
|
||||
|
||||
Nieistniejący ID filmu zwróci _404_ "Not Found".
|
||||
Niepoprawnie sformatowany ID filmu zwróci _400_ "Bad Request".
|
||||
|
||||
<!---
|
||||
## API documentation
|
||||
|
||||
Cała dokumentacja jest dostępna na naszej stronie.
|
||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||
|
||||
## Współtworzenie
|
||||
|
||||
Prosimy przeczytać [przewodnik współtworzenia](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
|
||||
|
||||
## Wesprzyj ten projekt!
|
||||
|
||||
Możesz wesprzeć ten projekt dotacjami poniżej:
|
||||
|
||||
[Wesprzyj](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## Sponsorzy
|
||||
|
||||
[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)
|
||||
@@ -0,0 +1,94 @@
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Leia isso em outros idiomas: [русский](READMEru.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md) ou [English (Para Melhor precisão!)](README.md)
|
||||
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
|
||||
<p align="center">
|
||||
<b>Return YouTube Dislike é uma extensão de codigo aberto que retorna com o contador de Deslike do Youtube.</b></i> Agora está disponivel apenas para os proprietarios dos Canais<i><br>
|
||||
Disponivel para Chrome e Firefox como uma extensão Web.<br>
|
||||
e também disponivel para outros navegadores como um JS UserScript.<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
|
||||
## Nossa Historia
|
||||
|
||||
Em 10 de novembro de 2021 a Google [Anuciou](https://blog.youtube/news-and-events/update-to-youtube/) que o contador de Deslikes do Youtube seria removido.
|
||||
|
||||
Additionally, the `dislike` field in the YouTube API was [removed](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) on December 13th, 2021, removing any ability to judge the quality of content before watching.
|
||||
|
||||
## Como isso funciona
|
||||
|
||||
With the removal of dislike stats from the YouTube API, our backend switched to using a combination of scraped dislike stats, estimates extrapolated from extension user data.
|
||||
|
||||
[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
|
||||
## Why it Matters
|
||||
|
||||
Você pode aprender mais no nosso site Aqui: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## Documentação da API
|
||||
|
||||
Third-party use of this open API is allowed with the following restrictions:
|
||||
|
||||
- **Attribution**: This project should be clearly attributed with a link to [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Rate Limiting**: There are per client rate limits in place of 100 per minute and 10,000 per day. This will return a _429_ status code indicating that your application should back off.
|
||||
|
||||
The API is accessible over the following base URL:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
List of available endpoints is available here:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Obtendo votos
|
||||
|
||||
Exemplo para obter os votos pelo 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
|
||||
}
|
||||
```
|
||||
|
||||
Nenhum youtube id exstente irá retornar o codigo de status _404_ "Nada encontrado".
|
||||
Wrong formed YouTube ID will return _400_ "Bad Request".
|
||||
|
||||
<!---
|
||||
## Documentação da API
|
||||
|
||||
Você pode visualizar toda a documentação no Site.
|
||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||
|
||||
## Contribuindo
|
||||
|
||||
Por favor leia o [Guia de contribuição](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGpt_BR.md).
|
||||
|
||||
## Ajude nosso projeto!
|
||||
|
||||
Você pode ajuda esse projeto doando para nos no link abaixo:
|
||||
|
||||
[Doar](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## Patrocinados
|
||||
|
||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||
|
||||
[Torne-se nosso Patrocinador](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
|
||||
|
||||
+3
-4
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,8 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Прочитать на других языках: [English](README.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
Прочитать на других языках: [English](README.md), [Español](READMEes.md), [Nederlands](READMEnl.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Magyar](READMEhu.md), [Danish](READMEda.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Läs detta på andra språk: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
<b>Return YouTube Dislike (Återinför YouTube Dislikes) är ett open-source tillägg som återinför antalet dislikes (nedåttummar) på YouTube.</b><br>
|
||||
Tillgängligt som tillägg för <a href="https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi">Chromium Browser</a> och <a href="https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/">Firefox</a>.<br>
|
||||
Finns även för andra webbläsare som JS Userscript.<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
|
||||
## Berättelsen <!-- The Story -->
|
||||
|
||||
Den 10 november 2021 [meddelade Google](https://blog.youtube/news-and-events/update-to-youtube/) att YouTubes dislikes skulle tas bort från plattformen.
|
||||
|
||||
Dessutom blev `dislike`-fältet i YouTubes API [borttaget](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) den 13 december 2021, vilket tog bort möjligheten att bedöma innehållets kvalitet innan visning.
|
||||
|
||||
## Vad det gör <!-- What it Does -->
|
||||
|
||||
Med borttagandet av dislike-statistiken från YouTubes API, bytte vår backend till att använda en kombination av skrapad dislike-statistik och uppskattningar utifrån data av tilläggsanvändare.
|
||||
|
||||
[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
|
||||
## Varför det är viktigt <!-- Why it Matters -->
|
||||
|
||||
Du kan läsa mer på vår webbplats: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## API dokumentation <!-- API documentation -->
|
||||
|
||||
Tredjepartsanvändning av detta öppna API är tillåtet med följande restriktioner:
|
||||
|
||||
- **Attribution**: Detta projekt ska tydligt tillskrivas med en länk till [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Frekvensbegränsning**: Det finns per klient hastighetsbegränsningar på 100 per minut och 10'000 per dag. Detta kommer att returnera en _429_ statuskod som indikerar att din applikation bör backa.
|
||||
|
||||
API:et är tillgängligt på följande bas-URL:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
En lista över tillgängliga ändpunkter finns här:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Hämta röster <!-- Get votes -->
|
||||
|
||||
Exempel för att hämta röster för en given 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
|
||||
}
|
||||
```
|
||||
|
||||
Inga existerande YouTube-ID returnerar statuskoden _404_ "Not Found".
|
||||
Felaktigt formade YouTube-ID returnerar _400_ "Bad Request".
|
||||
|
||||
<!---
|
||||
## API Dokumentation
|
||||
|
||||
Du kommer åt all dokumentation på vår webbplats.
|
||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||
|
||||
## Bidra <!-- Contributing -->
|
||||
|
||||
Läs gärna [bidragsguiden](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
|
||||
|
||||
## Stöd detta projekt! <!-- Support this project! -->
|
||||
|
||||
Du kan stödja detta projekt genom att donera till oss på länken nedan:
|
||||
|
||||
[Donera](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## Sponsorer <!-- Sponsors -->
|
||||
|
||||
[Piepacker](https://piepacker.com)
|
||||
|
||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||
|
||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||
|
||||
[Stöd oss på Patreon](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
+3
-4
@@ -1,5 +1,5 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
@@ -7,8 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Bunu diğer dillerde okuyun: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Français](READMEfr.md), [Nederlands](READMEnl.md), [日本語](READMEja.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
Bunu diğer dillerde okuyun: [English](README.md), [русский](READMEru.md), [Español](READMEes.md), [Français](READMEfr.md), [Nederlands](READMEnl.md), [日本語](READMEja.md), [українська](READMEuk.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Magyar](READMEhu.md), [Danish](READMEda.md)
|
||||
|
||||
# YouTube Dislike Sayısını Geri Getir
|
||||
|
||||
|
||||
+94
-94
@@ -1,94 +1,94 @@
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Read this in other languages: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md)
|
||||
|
||||
# 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>
|
||||
|
||||
## Історія
|
||||
|
||||
10 листопада 2021 року Google [оголосили](https://blog.youtube/news-and-events/update-to-youtube/), що лічильник відміток «Не подобається» на YouTube буде видалено.
|
||||
|
||||
Крім того, поле позначок `dislike` у YouTube API було [видалено](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 грудня 2021 року, прибравши єдину можливість оцінити якість вмісту перед переглядом.
|
||||
|
||||
## Як це працює
|
||||
|
||||
Після видаленням статистики відміток з API YouTube наш сервер перейшов на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними користувачів розширення.
|
||||
|
||||
[ЧаПи](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQuk.md)
|
||||
|
||||
## Чому це важливо
|
||||
|
||||
Ви можете дізнатися більше на нашому вебсайті: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## Документація API
|
||||
|
||||
Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:
|
||||
|
||||
- **Атрибуція**: Цей проєкт має бути чітко описано, використовуючи посилання на [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Обмеження**: Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу.
|
||||
|
||||
API доступно за наступною URL-адресою:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
Перелік доступних «ендпоінтів» можна переглянути тут:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Отримати оцінки
|
||||
|
||||
Приклад отримання оцінок відео на YouTube за ID:
|
||||
`/votes?videoId=kxOuG8jMIgI`
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "kxOuG8jMIgI",
|
||||
"dateCreated": "2021-12-20T12:25:54.418014Z",
|
||||
"likes": 27326,
|
||||
"dislikes": 498153,
|
||||
"rating": 1.212014408444885,
|
||||
"viewCount": 3149885,
|
||||
"deleted": false
|
||||
}
|
||||
```
|
||||
|
||||
Недійсний YouTube ID видасть код помилки 404 "Not Found".
|
||||
YouTube ID у невірному форматі видасть код помилки 400 "Bad Request".
|
||||
|
||||
<!---
|
||||
## Документація API
|
||||
|
||||
Ви можете переглянути всю документацію на нашому сайті.
|
||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||
|
||||
## Взяти участь у розробці
|
||||
|
||||
Будь ласка, ознайомтеся із [посібником внеску в проєкт](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGuk.md).
|
||||
|
||||
## Підтримайте цей проєкт!
|
||||
|
||||
Ви можете підтримати цей проєкт пожертвою за посиланням нижче:
|
||||
|
||||
[Підтримати](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## Спонсори
|
||||
|
||||
[Piepacker](https://piepacker.com)
|
||||
|
||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||
|
||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||
|
||||
[Станьте нашим спонсором](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Read this in other languages: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Français](READMEfr.md), [日本語](READMEja.md), [Türkçe](READMEtr.md), [Deutsch](READMEde.md), [Ελληνικά](READMEgr.md), [Svenska](READMEsv.md), [中文](READMEcn.md), [Polski](READMEpl.md), [Danish](READMEda.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>
|
||||
|
||||
## Історія
|
||||
|
||||
10 листопада 2021 року Google [оголосили](https://blog.youtube/news-and-events/update-to-youtube/), що лічильник відміток «Не подобається» на YouTube буде видалено.
|
||||
|
||||
Крім того, поле позначок `dislike` у YouTube API було [видалено](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 грудня 2021 року, прибравши єдину можливість оцінити якість вмісту перед переглядом.
|
||||
|
||||
## Як це працює
|
||||
|
||||
Після видаленням статистики відміток з API YouTube наш сервер перейшов на використання комбінації заархівованих статистичних даних відміток «Не подобається» екстрапольованих із даними користувачів розширення.
|
||||
|
||||
[ЧаПи](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQuk.md)
|
||||
|
||||
## Чому це важливо
|
||||
|
||||
Ви можете дізнатися більше на нашому вебсайті: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## Документація API
|
||||
|
||||
Використання цього відкритого API сторонніми особами дозволено з наступними обмеженнями:
|
||||
|
||||
- **Атрибуція**: Цей проєкт має бути чітко описано, використовуючи посилання на [returnyoutubedislike.com](https://returnyoutubedislike.com/).
|
||||
- **Обмеження**: Існують обмеження на швидкісті для кожного клієнта - 100 за хвилину і 10 000 за день. Це видасть код помилки 429, який вказує на те, що вашому додатку слід завершити роботу.
|
||||
|
||||
API доступно за наступною URL-адресою:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
Перелік доступних «ендпоінтів» можна переглянути тут:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### Отримати оцінки
|
||||
|
||||
Приклад отримання оцінок відео на YouTube за ID:
|
||||
`/votes?videoId=kxOuG8jMIgI`
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "kxOuG8jMIgI",
|
||||
"dateCreated": "2021-12-20T12:25:54.418014Z",
|
||||
"likes": 27326,
|
||||
"dislikes": 498153,
|
||||
"rating": 1.212014408444885,
|
||||
"viewCount": 3149885,
|
||||
"deleted": false
|
||||
}
|
||||
```
|
||||
|
||||
Недійсний YouTube ID видасть код помилки 404 "Not Found".
|
||||
YouTube ID у невірному форматі видасть код помилки 400 "Bad Request".
|
||||
|
||||
<!---
|
||||
## Документація API
|
||||
|
||||
Ви можете переглянути всю документацію на нашому сайті.
|
||||
[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
|
||||
|
||||
## Взяти участь у розробці
|
||||
|
||||
Будь ласка, ознайомтеся із [посібником внеску в проєкт](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTINGuk.md).
|
||||
|
||||
## Підтримайте цей проєкт!
|
||||
|
||||
Ви можете підтримати цей проєкт пожертвою за посиланням нижче:
|
||||
|
||||
[Підтримати](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## Спонсори
|
||||
|
||||
[Piepacker](https://piepacker.com)
|
||||
|
||||
[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
|
||||
|
||||
[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
|
||||
|
||||
[Станьте нашим спонсором](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [Nederlands](READMEnl.md), [Türkçe](READMEtr.md)
|
||||
Read this in other languages: [Nederlands](READMEnl.md), [Türkçe](READMEtr.md), [Deutsch](READMEde.md)
|
||||
|
||||
# return-youtube-dislike-site
|
||||
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
Read this in other languages: [English](README.md), [Nederlands](READMEnl.md), [Türkçe](READMEtr.md)
|
||||
|
||||
# return-youtube-dislike-site
|
||||
|
||||
## Build Setup
|
||||
|
||||
```bash
|
||||
# Abhängigkeiten installieren
|
||||
$ npm install
|
||||
|
||||
# Mit Hot Reload unter localhost:3000 bereitstellen
|
||||
$ npm run dev
|
||||
|
||||
# Linten Ihrer Änderungen
|
||||
$ npm run lint
|
||||
|
||||
# Für die Produktion erstellen und Server starten
|
||||
$ npm run build
|
||||
$ npm run start
|
||||
|
||||
# Statisches Projekt generieren
|
||||
$ npm run generate
|
||||
```
|
||||
|
||||
Für eine ausführliche Erklärung, wie die Dinge funktionieren, lesen Sie die [Dokumentation](https://nuxtjs.org).
|
||||
|
||||
## Empfohlene VSCode-Einrichtung
|
||||
|
||||
- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) `ext install dbaeumer.vscode-eslint`
|
||||
- [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) `ext install esbenp.prettier-vscode`
|
||||
- [Vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur)
|
||||
|
||||
> `Strg(Cmd)` + `Shift` + `P` > Einstellungen öffnen (JSON)
|
||||
|
||||
```
|
||||
"editor.formatOnSave": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": true
|
||||
}
|
||||
"vetur.validation.template": false,
|
||||
```
|
||||
|
||||
## Besondere Verzeichnisse
|
||||
|
||||
Sie können die folgenden zusätzlichen Verzeichnisse erstellen, von denen einige spezielle Verhaltensweisen haben. Nur `pages` ist erforderlich; Sie können sie löschen, wenn Sie ihre Funktionalität nicht verwenden möchten.
|
||||
|
||||
### `assets`
|
||||
|
||||
Das Verzeichnis assets enthält Ihre nicht kompilierten Assets wie Stylus- oder Sass-Dateien, Bilder oder Schriftarten.
|
||||
|
||||
Weitere Informationen zur Verwendung dieses Verzeichnisses finden Sie in [der Dokumentation](https://nuxtjs.org/docs/2.x/directory-structure/assets).
|
||||
|
||||
### `components`
|
||||
|
||||
Das Verzeichnis components enthält Ihre Vue.js-Komponenten. Komponenten bilden die verschiedenen Teile Ihrer Seite und können in Ihren Seiten, Layouts und sogar anderen Komponenten wiederverwendet und importiert werden.
|
||||
|
||||
Weitere Informationen zur Verwendung dieses Verzeichnisses finden Sie in [der Dokumentation](https://nuxtjs.org/docs/2.x/directory-structure/components).
|
||||
|
||||
### `layouts`
|
||||
|
||||
Layouts sind eine große Hilfe, wenn Sie das Aussehen und Verhalten Ihrer Nuxt-App ändern möchten, ob Sie eine Seitenleiste einbeziehen oder unterschiedliche Layouts für mobile und Desktop haben möchten.
|
||||
|
||||
Weitere Informationen zur Verwendung dieses Verzeichnisses finden Sie in [der Dokumentation](https://nuxtjs.org/docs/2.x/directory-structure/layouts).
|
||||
|
||||
### `pages`
|
||||
|
||||
Dieses Verzeichnis enthält Ihre Anwendungsansichten und Routen. Nuxt liest alle `*.vue`-Dateien in diesem Verzeichnis und richtet automatisch Vue Router ein.
|
||||
|
||||
Weitere Informationen zur Verwendung dieses Verzeichnisses finden Sie in [der Dokumentation](https://nuxtjs.org/docs/2.x/get-started/routing).
|
||||
|
||||
### `plugins`
|
||||
|
||||
Das Verzeichnis plugins enthält JavaScript-Plugins, die Sie ausführen möchten, bevor Sie die Root-Vue.js-Anwendung instanziieren. Hier fügen Sie Vue-Plugins hinzu und injizieren Funktionen oder Konstanten. Jedes Mal, wenn Sie `Vue.use()` verwenden möchten, sollten Sie eine Datei in `plugins/` erstellen und ihren Pfad zu Plugins in `nuxt.config.js` hinzufügen.
|
||||
|
||||
Weitere Informationen zur Verwendung dieses Verzeichnisses finden Sie in [der Dokumentation](https://nuxtjs.org/docs/2.x/directory-structure/plugins).
|
||||
|
||||
### `static`
|
||||
|
||||
Dieses Verzeichnis enthält Ihre statischen Dateien. Jede Datei in diesem Verzeichnis ist auf `/` abgebildet.
|
||||
|
||||
Beispiel: `/static/robots.txt` ist als `/robots.txt` abgebildet.
|
||||
|
||||
Weitere Informationen zur Verwendung dieses Verzeichnisses finden Sie in [der Dokumentation](https://nuxtjs.org/docs/2.x/directory-structure/static).
|
||||
|
||||
### `store`
|
||||
|
||||
Dieses Verzeichnis enthält Ihre Vuex-Store-Dateien. Das Erstellen einer Datei in diesem Verzeichnis aktiviert automatisch Vuex.
|
||||
|
||||
Weitere Informationen zur Verwendung dieses Verzeichnisses finden Sie in [der Dokumentation](https://nuxtjs.org/docs/2.x/directory-structure/store).
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [English](README.md), [Türkçe](READMEtr.md)
|
||||
Read this in other languages: [English](README.md), [Türkçe](READMEtr.md), [Deutsch](READMEde.md)
|
||||
|
||||
# return-youtube-dislike-site
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Bunu diğer dillerde okuyun: [English](README.md), [Nederlands](READMEnl.md)
|
||||
Read this in other languages: [English](README.md), [Nederlands](READMEnl.md), [Deutsch](READMEde.md)
|
||||
|
||||
# youtube-dislike-sayısını-geri-getir-site
|
||||
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
import { en } from "vuetify/src/locale";
|
||||
// By tubyoub
|
||||
export default {
|
||||
...en,
|
||||
home: {
|
||||
name: "Startseite",
|
||||
title: "Return YouTube Dislike",
|
||||
subtitle: "Eine Browser Erwiterung und eine API welche dir die YouTube dislikes zeigt",
|
||||
ukraine: "Unterstütz die Ukraine",
|
||||
sponsors: "Sponsoren",
|
||||
},
|
||||
install: {
|
||||
name: "Instalieren",
|
||||
title: "Wähle deine Platform",
|
||||
subtitle: "Erhältlich für Firefox und alle Chromium Browser",
|
||||
title2: "Andere Platformen",
|
||||
subtitle2: "Wenn dien Browser noch nicht unterstützt wird, versuch das UserSript",
|
||||
title3: "Implementierungen von Drittanbietern",
|
||||
subtitle3: "Keine Garantie von unserer Seite, nutzung auf eigene Gefahr",
|
||||
},
|
||||
api: {
|
||||
name: "API",
|
||||
title: "Willkommen zu der offiziellen RYD Dokumentation!",
|
||||
subtitle: "Um zu beginnen, wähle einen Bereich aus dem Menü.",
|
||||
rights: {
|
||||
title: "Nutzungsrechte",
|
||||
subtitle: "Die Nutzung dieser offenen API durch Dritte ist mit den folgenden Einschränkungen gestattet::",
|
||||
bullet1: "Namensnennung: ",
|
||||
bullet1text:
|
||||
"Dieses Projekt sollte eindeutig mit einem Link zu diesem Repo oder einem Link zu returnyoutubedislike.com gekennzeichnet werden",
|
||||
bullet2: "Begrenzung der Anfragen: ",
|
||||
bullet2text:
|
||||
"Es gibt Ratenbegrenzung pro Client von 100 pro Minute und 10.000 pro Tag. Dies führt zu einem Statuscode 429, der anzeigt, dass Ihre Anwendung warten sollte vor ihrer nächsten Anfrage",
|
||||
},
|
||||
url: {
|
||||
title: "URL Information",
|
||||
subtitle: "Die API ist über die folgende Basis-URL zugänglich: ",
|
||||
},
|
||||
endpoints: {
|
||||
title: "Verfügbare Endpunkte",
|
||||
subtitle: "Eine Liste aller Endpunkte sind hier zu finden: ",
|
||||
},
|
||||
fetching: {
|
||||
title: "Grundlegende Anleitung zum Abrufen der Daten",
|
||||
subtitle: "Grundlegende Anleitung zum Abrufen der Bewertung von einer gegebenen YouTube Video ID: ",
|
||||
title2: "Besipiel Anfragen: ",
|
||||
url: "Anfrage URL: ",
|
||||
method: "Anfrage Methoden: ",
|
||||
headers: "Kopfzeile: ",
|
||||
response: "Antwort: ",
|
||||
error1: 'Eine ungültige YouTube-ID liefert den Statuscode 404 "Not Found"',
|
||||
error2: 'Eine falsch formatierte YouTube-ID liefert den Statuscode 400 "Bad Request"',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
name: "Hilfe",
|
||||
title: "Fehlersuche",
|
||||
bullet1: "Stell sicher, dass sie die neuste Version der Erweiterung installiert haben, derzeit ist das die, ",
|
||||
bullet11: "",
|
||||
bullet2:
|
||||
"Versuch die Erweiterung zu entfernen und erneut zu installieren, und starte dann den Browser neu (alle aktiven Fenster, nicht nur eine Registerkarte)",
|
||||
bullet3: "Stell sicher das du den Link öffnest: ",
|
||||
bullet31: "Du solltest diesen Text sehen: ",
|
||||
bullet4: "Wenn nichts von dem oben Gesagten Lösungen hilft - melden Sie Ihr Problem in",
|
||||
bullet41: "in unserem",
|
||||
bullet4a: "Gib uns den Namen deines Betriebssystem, Browsernamen und die Browser Version ",
|
||||
bullet4b:
|
||||
"Mach ein Screenshot der Seite mit dem Problem (von der YouTube Video Seite) mit der Konsole offen (drücke ",
|
||||
bullet4b1: ") - Beispiel Screenshot unten.",
|
||||
bullet4c: "Mache ein Screenshot von deinen installierten Erweiterungen in deinem Browser .",
|
||||
bullet4c1: "Um diese Seite zu sehen gib das in dei Adressleiste ein: ",
|
||||
firefox: "für Firefox",
|
||||
chrome: "für Chrome, Edge, Brave, Opera, Vivaldi",
|
||||
},
|
||||
faq: {
|
||||
name: "FAQ",
|
||||
title: "Häufig gestellte Fragen",
|
||||
subtitle: "Hast du noch Fragen? Dann komm auf unseren Discord!",
|
||||
bullet1: "Woher kriegt die Erweiterung ihre Daten her?",
|
||||
bullet1text:
|
||||
"Eine Kombination aus archivierten Daten aus der Zeit, bevor die offizielle YouTube dislike API abgeschaltet wurde, und extrapoliertem Statistiken durch Analyse des Nutzerverhaltens.",
|
||||
bullet2: "Warum updated der Dislike counter nicht?",
|
||||
bullet2text:
|
||||
"Momentan werden die Dislikes von Videos im Cache gespeichert und nicht sehr häufig aktualisiert. Die Aktualisierung hängt von der Popularität eines Videos ab, kann aber zwischen ein paar Stunden und ein paar Tagen dauern.",
|
||||
bullet3: "Wie funktioniert die Extension?",
|
||||
bullet3text:
|
||||
"Die Erweiterung sammelt die Video-ID des Videos, das du dir ansiehst, und ruft die Dislikes (und andere Felder wie views, Likes usw.) über unsere API ab. Die Erweiterung zeigt dann die Anzahl der Dislikes und das Like/Dislike verhalten auf der Seite an. Wenn Ihnen ein Video gefällt oder nicht gefällt, wird dies aufgezeichnet und an die Datenbank gesendet, so dass eine genaue Anzahl der Ablehnungen bestimmt werden kann.",
|
||||
bullet4: "Kann ich meine Dislikes mit euch teilen?",
|
||||
bullet4text:
|
||||
"Demnächst. Wir prüfen die Verwendung von Oauth oder einer anderen Read-Only-API mit begrenztem Umfang, damit die Ersteller ihre Dislike Anzahl verifizieren können.",
|
||||
bullet5: "Was für Daten sammelt ihr und wie werden sie verarbeitet?",
|
||||
bullet5text:
|
||||
'Die Erweiterung sammelt nur Daten, die für ihr ordnungsgemäßes Funktionieren unbedingt erforderlich sind, z. B. die IP-Adresse oder die ID des Videos, das Sie sich ansehen. Keine Ihrer Daten wird jemals an Dritte verkauft werden. Wenn du mehr darüber erfahren möchtest, wie wir mit Sicherheit und Datenschutz umgehen, lesen Sie unsere <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md"> Sicherheits-FAQ </a>.',
|
||||
bullet6: "Wie Funktioniert die API / das Backend?",
|
||||
bullet6text:
|
||||
"Das Backend verwendet archivierte Daten aus der Zeit, als die YouTube API noch die Anzahl der Dislikes, die Anzahl der Likes und Dislikes der Extension nutzer und die Hochrechnung zurückgab. In naher Zukunft werden wir es Creator ermöglichen, ihre Dislike-Anzahl einfach und sicher zu übermitteln, und wir werden die archivierten Daten von ArchiveTeam (4,56 Milliarden Videos) in unsere aktuelle Datenbank aufnehmen. Sie können sich auch ein Video zu diesem Thema ansehen.",
|
||||
bullet7: "Warum zeigt der Dislike Counter manchmal 'DISLIKES DISABLED'?",
|
||||
bullet7text:
|
||||
"Manchmal wird bei einem kürzlich hochgeladenen Video 'DISLIKES DISABLED' angezeigt, auch wenn der Creator es nicht deaktiviert hat. Das liegt daran, wie wir erkennen, ob Dislikes deaktiviert sind, es sollte in ein paar Stunden verschwinden oder indem man das Video Liked oder disliked und die Seite aktualisiert (hoffentlich).",
|
||||
},
|
||||
donate: {
|
||||
name: "Spenden",
|
||||
subtitle: "Du kannst unsere Bemühungen, das Internet frei zu halten, mit einer Spende unterstützen !",
|
||||
},
|
||||
links: {
|
||||
name: "Links",
|
||||
title: "Project Links",
|
||||
subtitle: "Link zu dem Projekt und deren Developer",
|
||||
contact: "Kontakt",
|
||||
translators: "Übersezter",
|
||||
coolProjects: "Cool Projects",
|
||||
sponsorBlockDescription: "Überspringe integrierte Werbung in Videos ",
|
||||
filmotDescription: "Suche nach YouTube Videos über ihre Untertitel",
|
||||
},
|
||||
};
|
||||
@@ -54,8 +54,9 @@ export default {
|
||||
headers: "En-têtes (headers) : ",
|
||||
response: "Réponse : ",
|
||||
error1:
|
||||
'Si aucune vidéo YouTube n\'a cet ID, le code d\'erreur 404 "Not Found" sera retourné',
|
||||
error2: 'Un ID YouTube invalide renverra le code d\'erreur *400* "Bad Request"',
|
||||
"Si aucune vidéo YouTube n'a cet ID, le code d'erreur 404 \"Not Found\" sera retourné",
|
||||
error2:
|
||||
'Un ID YouTube invalide renverra le code d\'erreur *400* "Bad Request"',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
import { hu } from 'vuetify/src/locale';
|
||||
// By Gergely Pap
|
||||
export default {
|
||||
...hu,
|
||||
home: {
|
||||
name: 'Főoldal',
|
||||
title: 'Return YouTube Dislike',
|
||||
subtitle:
|
||||
'Bővítmény és API, ami visszahozza a YouTube dislike számlálót.',
|
||||
ukraine: 'Támogatjuk Ukrajnát',
|
||||
sponsors: 'Szponzorok',
|
||||
},
|
||||
install: {
|
||||
name: 'Telepítés',
|
||||
title: 'Válassz platformot!',
|
||||
subtitle: 'Elérhető Firefoxhoz és Chromium böngészőkhöz',
|
||||
title2: 'Egyéb platformok',
|
||||
subtitle2:
|
||||
'Ha a böngésződ még nem támogatott, próbáld ezt a UserScriptet',
|
||||
title3: 'Third Party implementációk',
|
||||
subtitle3:
|
||||
'Nem vállalunk érte felelősséget, használd saját belátásod szerint',
|
||||
},
|
||||
api: {
|
||||
name: 'API',
|
||||
title: 'Üdv a hivatalos RYD dokumentáción!',
|
||||
subtitle: 'A kezdéshez válassz egy szekciót a menüből!',
|
||||
rights: {
|
||||
title: 'Felhasználási jogok',
|
||||
subtitle:
|
||||
'Ennek az API-nak a saját felhasználását az alábbiak mellett engedélyezzük:',
|
||||
bullet1: 'Forrásmegjelölés: ',
|
||||
bullet1text:
|
||||
'Ezt a projektet jól láthatóan fel kell tüntetni egy repóra vagy a returnyoutubedislike.com oldalra mutató linkkel.',
|
||||
bullet2: 'Rate Limiting: ',
|
||||
bullet2text:
|
||||
'Kliensoldalon gyakoriság-korlátozás van beállítva percenként 100, naponta maximum 10 000 lekérésre. Túllépés esetén 429 státuszkód jelzi, hogy az alkalmazásod nem küldhet több lekérést.',
|
||||
},
|
||||
url: {
|
||||
title: 'URL információ',
|
||||
subtitle: 'Az API ezen a base URL-en érhető el: ',
|
||||
},
|
||||
endpoints: {
|
||||
title: 'Elérhető endpointok',
|
||||
subtitle: 'Az elérhető endpointok listája itt található: ',
|
||||
},
|
||||
fetching: {
|
||||
title: 'Tutorial egy lekéréshez',
|
||||
subtitle:
|
||||
'Példa egy adott YouTube videó ID adatainak lekéréséhez: ',
|
||||
title2: 'Példa lekérés: ',
|
||||
url: 'Lekérés URL: ',
|
||||
method: 'Lekérés Method: ',
|
||||
headers: 'Header: ',
|
||||
response: 'Válasz: ',
|
||||
error1: 'Nem létező YouTube ID esetén 404 "Not Found" válasz érkezik.',
|
||||
error2: 'Rossz formátumú YouTube ID esetén 400 "Bad Request" választ küldünk.',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
name: 'Segítség',
|
||||
title: 'Hibaelhárítás',
|
||||
bullet1:
|
||||
'Győződj meg, hogy a bővítmény legújabb verziója van telepítve, ami ',
|
||||
bullet11: 'jelenleg.',
|
||||
bullet2:
|
||||
'Próbáld meg újratelepíteni a bővítményt, majd újraindítani a böngészőt (az összes aktív ablakot, nem csak egy tabot).',
|
||||
bullet3: 'Ellenőrizd ezt a linket: ',
|
||||
bullet31: 'ezt a szöveget kellene látnod: ',
|
||||
bullet4: 'Ha a fentiek közül egyik sem segít, jelentsd a problémát a',
|
||||
bullet41: 'channelen a Discord szerverünkön: ',
|
||||
bullet4a:
|
||||
'Add meg az operációs rendszered, illetve a böngésződ nevét és verzióját!',
|
||||
bullet4b:
|
||||
'Készíts screenshotot a problémáról (pl. a YouTube videó oldala) úgy, hogy nyitva van a konzol (ehhez nyomd meg az ',
|
||||
bullet4b1: ' billentyűt)! Példa:',
|
||||
bullet4c: 'Készíts screenshotot a bővítmények oldalról!',
|
||||
bullet4c1: 'A bővítmények listájához írd be a címsorba: ',
|
||||
firefox: 'Firefox esetén',
|
||||
chrome: 'Chrome, Edge, Brave, Opera és Vivaldi esetén',
|
||||
},
|
||||
faq: {
|
||||
name: 'GYIK',
|
||||
title: 'Gyakran Ismételt Kérdések',
|
||||
subtitle: 'Lenne még kérdésed? Csatlakozz a Discordunkhoz!',
|
||||
bullet1: 'Honnan szerzi a bővítmény az adatokat?',
|
||||
bullet1text:
|
||||
'A YouTube dislike API leállítása előtt archivált adatok és a bővítményt használók adatainak kombinációjából.',
|
||||
bullet2: 'Miért nem frissül a dislike számláló?',
|
||||
bullet2text:
|
||||
'Alapból a dislike-ok cache-elve vannak, és nem frissülnek túl gyakran. Ez a videó népszerűségétől függően változhat, de maximum pár órán vagy napon belül frissülnek az értékek.',
|
||||
bullet3: 'Hogyan működik ez az egész?',
|
||||
bullet3text:
|
||||
'A bővítmény begyűjti az éppen megnyitott videó ID-ját, és a saját API-nkon keresztül lekéri a dislike számot (illetve mást is, például a megtekintések és like-ok számát). Ezután megjeleníti az oldalon a dislike számlálót és az arányt. Ha like-olsz vagy dislike-olsz egy videót, azt az adatbázisunk eltárolja, hogy ki tudjuk következtetni a pontos értékeket.',
|
||||
bullet4: 'Megoszthatom a saját videóim dislike számait veletek?',
|
||||
bullet4text:
|
||||
'Hamarosan. Vizsáljuk egy Oauth vagy hasonló, csak olvasható, korlátozott API használatának lehetőségét, hogy a tartalomkészítők a valós dislike számaikat is meg tudják osztani.',
|
||||
bullet5: 'Milyen adatot gyűjtötök és hogyan kezelitek azokat?',
|
||||
bullet5text:
|
||||
'A bővítmény csak olyan adatot gyűjt, ami a megfelelő működéshez nélkülözhetetlen, ilyen az IP cím és az éppen megtekintett videó ID-ja. Soha, semmilyen adatot nem adunk el harmadik fél számára. Ha szeretnél többet megtudni az adatkezelésünkről és a biztonságról, nézd meg a <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">Security GYIK-et</a>!',
|
||||
bullet6: 'Hogyan működik az API/Backend?',
|
||||
bullet6text:
|
||||
'A backend a YouTube API változása előtt archivált adatokat és a bővítményt használók like/dislike adatait használja fel egy extrapolált értékhez. Hamarosan támogatni fogjuk, hogy a tartalomkészítők könnyen és biztonságosan beküldhessék a pontos dislike számaikat, illetve az ArchiveTeam által archivált (4,56 milliárd videót tartalmazó) adathalmazt is felvisszük az adatbázisunkba. Erről egy videót is megtekinthetsz.',
|
||||
bullet7: "Miért mutatja a számláló, hogy 'DISLIKES DISABLED'?",
|
||||
bullet7text:
|
||||
"Egy nemrég feltöltött videónál néha előfordulhat a 'DISLIKES DISABLED' üzenet akkor is, ha a készítője nem kapcsolta ki azt. Ennek köze van ahhoz, ahogyan a kikapcsolt dislike-okat ellenőrizzük, de pár órán belül el kell tűnnie, vagy ha nem, like-olás vagy dislike-olás utáni oldalfrissítésre (remélhetőleg).",
|
||||
},
|
||||
donate: {
|
||||
name: 'Támogatás',
|
||||
subtitle:
|
||||
'Támogathatod a szabad internetért folytatott erőfeszítéseinket egy adománnyal.',
|
||||
},
|
||||
links: {
|
||||
name: 'Linkek',
|
||||
title: 'Projekt linkek',
|
||||
subtitle: 'Linkek a projekthez és a fejlesztőkhöz',
|
||||
contact: 'Kapcsolat',
|
||||
translators: 'Fordítók',
|
||||
coolProjects: 'Hasonló projektek',
|
||||
sponsorBlockDescription: 'Átugorja a videókba épített reklámokat.',
|
||||
filmotDescription: 'YouTube videók keresése felirat alapján.',
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,119 @@
|
||||
import { en } from "vuetify/src/locale";
|
||||
|
||||
export default {
|
||||
...en,
|
||||
home: {
|
||||
name: "Home",
|
||||
title: "Return YouTube Dislike",
|
||||
subtitle: "Estensione per browser e un API che ti mostra il numero di Non mi piace su YouTube",
|
||||
ukraine: "Sostieni l'Ucraina",
|
||||
sponsors: "Sponsor",
|
||||
},
|
||||
install: {
|
||||
name: "Installa",
|
||||
title: "Seleziona la tua piattaforma",
|
||||
subtitle: "Disponibile per Firefox e per tutti i browser Chromium",
|
||||
title2: "Altre piattaforme",
|
||||
subtitle2: "Se il tuo browser non è ancora supportato, prova questo script utente",
|
||||
title3: "Implementazioni di terze parti",
|
||||
subtitle3: "Nessuna responsabilità da parte nostra, usa a tuo rischio e pericolo",
|
||||
},
|
||||
api: {
|
||||
name: "API",
|
||||
title: "Ecco a te i documenti RYD ufficiali!",
|
||||
subtitle: "Per iniziare, seleziona una sezione dal menu.",
|
||||
rights: {
|
||||
title: "Diritti di utilizzo",
|
||||
subtitle:
|
||||
"L'utilizzo di questo API da parte di terzi è consentito secondo le seguenti restrizioni",
|
||||
bullet1: "Attribuzione: ",
|
||||
bullet1text:
|
||||
"Questo progetto deve venire chiaramente attribuito via un link a questa repo o a returnyoutubedislike.com",
|
||||
bullet2: "Limiti di richieste: ",
|
||||
bullet2text:
|
||||
"I limiti per il numero di richeste per ogni client sono di 100 al minuto o 10.000 al giorno. Questo comporterà un codice 429 che intima all'applicazione di interrompere le richieste.",
|
||||
},
|
||||
url: {
|
||||
title: "Informazioni URL",
|
||||
subtitle: "L'API è accesssibile dal seguente URL base: ",
|
||||
},
|
||||
endpoints: {
|
||||
title: "Endpoint disponibili",
|
||||
subtitle: "È disponibile una lista di endpoint disponibili qui: ",
|
||||
},
|
||||
fetching: {
|
||||
title: "Tutorial per richiesta basica",
|
||||
subtitle: "Esempio per ottenere i voti di un dato ID video di YouTube: ",
|
||||
title2: "Esempio richiesta: ",
|
||||
url: "URL richiesta: ",
|
||||
method: "Metodo richiesta: ",
|
||||
headers: "Intestazioni: ",
|
||||
response: "Risposta: ",
|
||||
error1: 'Un ID YouTube non valido restituirà un codice 404 "Not Found"',
|
||||
error2:
|
||||
'Un ID YouTube formattato incorrettamente restituirà 400 "Bad Request"',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
name: "Aiuto",
|
||||
title: "Risoluzione problemi",
|
||||
bullet1: "Assicurati di aver installato l'ultima versione dell'estensione, ",
|
||||
bullet11: "adesso",
|
||||
bullet2:
|
||||
"Prova rimuovendo l'estensione e installandola di nuovo, poi riavvia il browser (tutte le finestre attive, non solo un pannello)",
|
||||
bullet3: "Assicurati che questo link si apra: ",
|
||||
bullet31: "dovresti vedere solo testo: ",
|
||||
bullet4: "Se non funziona nulla di tutto ciò, segnala il tuo problema in",
|
||||
bullet41: "nel nostro",
|
||||
bullet4a: "Dicci il tuo sistema operativo, nome del browser e versione del browser",
|
||||
bullet4b:
|
||||
"Fai uno screenshot della pagina con il problema (es. pagina video di YouTube) con la console aperta (premi ",
|
||||
bullet4b1: "), screenshot di esempio in basso.",
|
||||
bullet4c:
|
||||
"Fai uno screenshot della pagina delle estensioni del tuo browser con l'estensione installata.",
|
||||
bullet4c1: "Per vedere le estensioni inserisci questo nella barra di ricerca: ",
|
||||
firefox: "per Firefox",
|
||||
chrome: "per Chrome, Edge, Brave, Opera e Vivaldi",
|
||||
},
|
||||
faq: {
|
||||
name: "FAQ",
|
||||
title: "Domande frequenti",
|
||||
subtitle: "Hai ancora domande? Unisciti al nostro Discord!",
|
||||
bullet1: "Da dove ottiene i propri dati l'estensione?",
|
||||
bullet1text:
|
||||
"Una combinazione di dati archiviati da prima della disattivazione dell'API ufficiale di YouTube per i Non mi piace e di dati estrapolati dall'utilizzo dell'estensione da parte degli utenti.",
|
||||
bullet2: "Perché il contatore dei Non mi piace non si aggiorna?",
|
||||
bullet2text:
|
||||
"Adesso i Non mi piace sono precaricati e non vengono aggiornati spesso. Dipende dalla popolarità del video, ma può volerci da qualche ora a qualche giorno per aggiornarsi.",
|
||||
bullet3: "Come funziona?",
|
||||
bullet3text:
|
||||
"L'estensione legge l'ID del video che stai guardando e ottiene il numero di Non mi piace (e altri parametri come visualizzazioni, Mi piace, ecc.) usando il nostro API. L'estensione, quindi, mostra il numero di Non mi piace e il rapporto sulla pagina. Se metti Mi piace o Non mi piace a un video, questo viene registrato e inviato al database così da estrapolare un numero di Non mi piace accurato.",
|
||||
bullet4: "Posso condividere il mio numero di Non mi piace con voi?",
|
||||
bullet4text:
|
||||
"In arrivo a breve. Stiamo valutando l'utilizzo di Oauth o di un altro API in sola lettura con un'estensione limitata per permettere ai creatori di condividere la verificabilità del loro conteggio di Non mi piace.",
|
||||
bullet5: "Che dati raccogliete e come sono trattati?",
|
||||
bullet5text:
|
||||
'L\'estensione raccoglie solo i dati strettamente necessari per funzionare in modo corretto, come l\'indirizzo IP o l\'ID del video che stai guardando. I tuoi dati non verranno mai venduti a terze parti. Se vuoi sapere di più su come gestiamo la sicurezza e la privacy dai un\'occhiata al nostro <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">security FAQ</a>.',
|
||||
bullet6: "Come funziona l'API/backend?",
|
||||
bullet6text:
|
||||
"Il backend utilizza dati archiviati da quando l'API di YouTube restituiva ancora il numero di Non mi piace e dati sui Mi Piace/Non mi piace estrapolati dall'utilizzo dell'estensione da parte degli utenti. Nel prossimo futuro permetteremo ai creatori di contenuti di presentare il loro numero di Non mi piace in modo semplice e sicuro e aggiungeremo i dati archiviati da ArchiveTeam (4,56 miliardi di video) al nostro database corrente. Puoi anche guardare un video a riguardo.",
|
||||
bullet7: "Perché il conteggio dei Non mi piace dice 'NON MI PIACE DISATTIVATI'?",
|
||||
bullet7text:
|
||||
"A volte un video caricato da poco potrebbe mostrare 'MI PIACE DISATTIVATI' anche se il creatore non li ha disattivati, ciò è dato da come rileviamo se i Non mi piace sono disattivati, dovrebbe sparire da solo in un paio d'ore o dopo aver messo Mi piace o Non mi piace al video e riaricato la pagina (si spera).",
|
||||
},
|
||||
donate: {
|
||||
name: "Dona",
|
||||
subtitle:
|
||||
"Puoi sostenere il nostro lavoro per mantenere l'internet libero con una donazione!",
|
||||
},
|
||||
links: {
|
||||
name: "Link",
|
||||
title: "Link progetti",
|
||||
subtitle: "Link al progetto e ai suoi sviluppatori",
|
||||
contact: "Contattami",
|
||||
translators: "Traduttori",
|
||||
coolProjects: "Progetti interessanti",
|
||||
sponsorBlockDescription: "Salta gli annunci integrati nei video",
|
||||
filmotDescription: "Cerca video su YouTube tramite i sottotitoli",
|
||||
},
|
||||
};
|
||||
+10
-7
@@ -1,5 +1,5 @@
|
||||
import { ko } from "vuetify/src/locale";
|
||||
|
||||
//libaraldev
|
||||
export default {
|
||||
...ko,
|
||||
home: {
|
||||
@@ -14,7 +14,8 @@ export default {
|
||||
title: "플랫폼 선택",
|
||||
subtitle: "파이어폭스와 모든 크로미엄 기반 브라우저에서 사용 가능",
|
||||
title2: "다른 플랫폼",
|
||||
subtitle2: "당신의 브라우저가 아직 지원하지 않는 경우, 이 유저스크립트를 시도할 수 있습니다",
|
||||
subtitle2:
|
||||
"당신의 브라우저가 아직 지원하지 않는 경우, 이 유저스크립트를 시도할 수 있습니다",
|
||||
title3: "서드파티 구현",
|
||||
subtitle3: "우리 측의 책임이 없으며, 사용자의 책임하에 사용하십시오",
|
||||
},
|
||||
@@ -49,9 +50,9 @@ export default {
|
||||
method: "요청 메소드: ",
|
||||
headers: "헤더: ",
|
||||
response: "응답: ",
|
||||
error1: '유효하지 않은 유튜브 ID는 상태 코드 404 "Not Found"를 리턴합니다',
|
||||
error2:
|
||||
'잘못된 포멧의 유튜브 ID는 400 "Bad Request"를 리턴합니다',
|
||||
error1:
|
||||
'유효하지 않은 유튜브 ID는 상태 코드 404 "Not Found"를 리턴합니다',
|
||||
error2: '잘못된 포멧의 유튜브 ID는 400 "Bad Request"를 리턴합니다',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
@@ -63,7 +64,8 @@ export default {
|
||||
"확장 프로그램을 제거하고 재설치한 다음, 브라우저를 재시작 하세요(모든 활성 창을 말하며, 단지 하나의 탭을 말하는 것이 아닙니다)",
|
||||
bullet3: "이 링크가 열리는지 확인하세요: ",
|
||||
bullet31: "평문이 표시되어야 합니다: ",
|
||||
bullet4: "위의 내용이 도움이 되지 않는 경우, 우리의 디스코드에서 다음과 같은 채널에서 당신의 문제를 보고하세요.",
|
||||
bullet4:
|
||||
"위의 내용이 도움이 되지 않는 경우, 우리의 디스코드에서 다음과 같은 채널에서 당신의 문제를 보고하세요.",
|
||||
bullet41: "디스코드: ",
|
||||
bullet4a: "운영체제, 브라우저 이름과 브라우저 버전을 우리한테 말해주세요",
|
||||
bullet4b:
|
||||
@@ -78,7 +80,8 @@ export default {
|
||||
faq: {
|
||||
name: "FAQ",
|
||||
title: "자주 묻는 질문",
|
||||
subtitle: "여전히 의문점이 있으신가요? 우리의 디스코드에 무료로 가입하세요!",
|
||||
subtitle:
|
||||
"여전히 의문점이 있으신가요? 우리의 디스코드에 무료로 가입하세요!",
|
||||
bullet1: "확장 프로그램은 어디에서 데이터를 가져옵니까?",
|
||||
bullet1text:
|
||||
"공식 유튜브 싫어요 API가 닫히기 전에 보환된 데이터와 확장 프로그램 사용자 행동을 추정한 값의 조합입니다",
|
||||
|
||||
+14
-7
@@ -5,7 +5,8 @@ export default {
|
||||
home: {
|
||||
name: "Home",
|
||||
title: "Return YouTube Dislike",
|
||||
subtitle: "Browser-extensie en een API die je antipathieën op YouTube laat zien",
|
||||
subtitle:
|
||||
"Browser-extensie en een API die je antipathieën op YouTube laat zien",
|
||||
ukraine: "Support Ukraine",
|
||||
sponsors: "Sponsors",
|
||||
},
|
||||
@@ -14,7 +15,8 @@ export default {
|
||||
title: "Kies je platform",
|
||||
subtitle: "Beschikbaar voor Firefox en alle Chromium-browsers",
|
||||
title2: "Andere Platformen",
|
||||
subtitle2: "Als uw browser nog niet wordt ondersteund, probeer dan dit UserScript",
|
||||
subtitle2:
|
||||
"Als uw browser nog niet wordt ondersteund, probeer dan dit UserScript",
|
||||
title3: "Implementaties van derden",
|
||||
subtitle3: "Geen aansprakelijkheid aan onze kant, gebruik op eigen risico",
|
||||
},
|
||||
@@ -43,13 +45,15 @@ export default {
|
||||
},
|
||||
fetching: {
|
||||
title: "Basiscursus ophalen",
|
||||
subtitle: "Voorbeeld om stemmen te krijgen voor een bepaalde YouTube-video-ID: ",
|
||||
subtitle:
|
||||
"Voorbeeld om stemmen te krijgen voor een bepaalde YouTube-video-ID: ",
|
||||
title2: "Voorbeeld aanvraag: ",
|
||||
url: "Verzoek-URL: ",
|
||||
method: "Verzoekmethode:: ",
|
||||
headers: "Koppen: ",
|
||||
response: "Antwoord: ",
|
||||
error1: 'Een ongeldige YouTube-ID retourneert statuscode 404 "Niet gevonden"',
|
||||
error1:
|
||||
'Een ongeldige YouTube-ID retourneert statuscode 404 "Niet gevonden"',
|
||||
error2:
|
||||
'Een onjuist opgemaakte YouTube-ID retourneert 400 "Slecht verzoek"',
|
||||
},
|
||||
@@ -57,7 +61,8 @@ export default {
|
||||
help: {
|
||||
name: "Help",
|
||||
title: "Probleemoplossen",
|
||||
bullet1: "Zorg ervoor dat u de nieuwste versie van de extensie hebt geïnstalleerd, ",
|
||||
bullet1:
|
||||
"Zorg ervoor dat u de nieuwste versie van de extensie hebt geïnstalleerd, ",
|
||||
bullet11: "direct",
|
||||
bullet2:
|
||||
"Probeer de extensie te verwijderen en opnieuw te installeren, en start vervolgens de browser opnieuw (alle actieve vensters, niet slechts één tabblad)",
|
||||
@@ -78,7 +83,8 @@ export default {
|
||||
faq: {
|
||||
name: "FAQ",
|
||||
title: "Veel Gestelde Vragen",
|
||||
subtitle: "Heeft u nog vragen? Voel je vrij om lid te worden van onze Discord!",
|
||||
subtitle:
|
||||
"Heeft u nog vragen? Voel je vrij om lid te worden van onze Discord!",
|
||||
bullet1: "Waar haalt de extensie zijn gegevens vandaan?",
|
||||
bullet1text:
|
||||
"Een combinatie van gearchiveerde gegevens van voordat de officiële YouTube-dislike-API werd afgesloten, en geëxtrapoleerd gebruikersgedrag van extensies.",
|
||||
@@ -97,7 +103,8 @@ export default {
|
||||
bullet6: "Hoe werkt de API/Backend?",
|
||||
bullet6text:
|
||||
"De backend gebruikt gearchiveerde gegevens van toen de youtube-api nog steeds het aantal dislikes retourneerde, extensiegebruikers zoals het aantal likes/dislikes en extrapolatie. In de nabije toekomst zullen we het voor makers van inhoud mogelijk maken om eenvoudig en veilig hun afkeuren-aantal in te dienen en we zullen de gearchiveerde gegevens van ArchiveTeam (4,56 miljard video's) toevoegen aan onze huidige database. U kunt ook een video over het onderwerp bekijken.",
|
||||
bullet7: "Waarom wordt bij het aantal dislikes 'DISLIKES DISABLED' weergegeven?",
|
||||
bullet7:
|
||||
"Waarom wordt bij het aantal dislikes 'DISLIKES DISABLED' weergegeven?",
|
||||
bullet7text:
|
||||
"Soms kan een recent geüploade video 'DISLIKES UITGESCHAKELD' weergeven, zelfs als de maker dit niet heeft uitgeschakeld. Dit komt door de manier waarop we detecteren of dislikes zijn uitgeschakeld, het zou binnen een paar uur moeten verdwijnen of door de video leuk of niet leuk te vinden en de pagina vernieuwen (hopelijk).",
|
||||
},
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
import { pl } from "vuetify/src/locale";
|
||||
// by itsbudyn#6502
|
||||
export default {
|
||||
...pl,
|
||||
home: {
|
||||
name: "Strona główna",
|
||||
title: "Return YouTube Dislike",
|
||||
subtitle:
|
||||
"Rozszerzenie do przeglądarki i API pokazujące ilość łapek w dół na YouTube",
|
||||
ukraine: "Wesprzyj Ukrainę",
|
||||
sponsors: "Sponsorzy",
|
||||
},
|
||||
install: {
|
||||
name: "Instalacja",
|
||||
title: "Wybierz swoją platformę",
|
||||
subtitle: "Dostępne dla Firefox i wszystkich przeglądarek Chromium",
|
||||
title2: "Inne platformy",
|
||||
subtitle2:
|
||||
"Jeżeli twoja przeglądarka nie jest wspierana, wypróbuj ten UserScript",
|
||||
title3: "Implementacje od stron trzecich",
|
||||
subtitle3:
|
||||
"Nie ponosimy za nie odpowiedzialności, używasz na własne ryzyko",
|
||||
},
|
||||
api: {
|
||||
name: "API",
|
||||
title: "Witamy w oficjalnej dokumentacji RYD!",
|
||||
subtitle: "Aby rozpocząć, wybierz sekcję z menu.",
|
||||
rights: {
|
||||
title: "Prawa do użytku",
|
||||
subtitle:
|
||||
"Używanie tego otwartego API jest dozwolone z następującymi ograniczeniami:",
|
||||
bullet1: "Przypisanie: ",
|
||||
bullet1text:
|
||||
"Ten projekt powinien być widocznie przypisany autorom za pomocą linku do tego repozytorium, albo do returnyoutubedislike.com",
|
||||
bullet2: "Ograniczenia: ",
|
||||
bullet2text:
|
||||
"Istnieją ograniczenia żądań dla klientów - 100 na minutę, oraz 10 000 na dzień. Przekroczenie będzie sygnowane zwrotem kodu 429 wskazujący, że Twoja aplikacja powinna przyhamować. ",
|
||||
},
|
||||
url: {
|
||||
title: "Informacje o URL",
|
||||
subtitle: "API jest dostępne przez następujące bazowe URL: ",
|
||||
},
|
||||
endpoints: {
|
||||
title: "Dostępne endpointy",
|
||||
subtitle: "Lista dostępnych endpointów znajduje się tutaj: ",
|
||||
},
|
||||
fetching: {
|
||||
title: "Poradnik - Podstawowe pobieranie",
|
||||
subtitle:
|
||||
"Przykład pozwalający otrzymać głosy z danego ID filmu na YouTube: ",
|
||||
title2: "Przykładowe żądanie: ",
|
||||
url: "URL żądania: ",
|
||||
method: "Metoda żądania: ",
|
||||
headers: "Nagłówki: ",
|
||||
response: "Odpowiedź: ",
|
||||
error1: 'Nieprawidłowy ID filmu zwróci kod 404 "Not Found"',
|
||||
error2:
|
||||
'Nieprawidłowo sformatowany ID filmu zwróci kod 400 "Bad Request"',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
name: "Pomoc",
|
||||
title: "Rozwiązywanie problemów",
|
||||
bullet1:
|
||||
"Upewnij się, że masz zainstalowaną najnowszą wersję rozszerzenia, ",
|
||||
bullet11: "obecnie.",
|
||||
bullet2:
|
||||
"Spróbuj usunąć rozszerzenie i zainstalować je ponownie, a następnie zrestartować przeglądarkę (wszystkie aktywne okna, nie tylko jedną kartę)",
|
||||
bullet3: "Upewnij się, że ten link się otwiera: ",
|
||||
bullet31: "powinno się wyświetlić w czystym tekście: ",
|
||||
bullet4: "Jeśli nic powyżej nie pomoże - zgłoś problem na",
|
||||
bullet41: "na naszym",
|
||||
bullet4a:
|
||||
"Powiedz z jakiego systemu operacyjnego korzystasz, oraz podaj nazwę i wersję przeglądarki",
|
||||
bullet4b:
|
||||
"Wykonaj zrzut ekranu problematycznej strony (tj. strony filmu na YouTube) z otwartą konsolą (naciśnij ",
|
||||
bullet4b1: ") - przykładowy zrzut poniżej.",
|
||||
bullet4c:
|
||||
"Wykonaj zrzut ekranu strony z rozszerzeniami Twojej przeglądarki, wraz z zainstalowanym rozszerzeniem.",
|
||||
bullet4c1: "Aby zobaczyć rozszerzenia, wklej do paska adresowego: ",
|
||||
firefox: "dla Firefox",
|
||||
chrome: "dla Chrome, Edge, Brave, Opera oraz Vivaldi",
|
||||
},
|
||||
faq: {
|
||||
name: "FAQ",
|
||||
title: "Często zadawane pytania",
|
||||
subtitle: "Wciąż masz pytania? Zapraszamy na naszego Discorda!",
|
||||
bullet1: "Skąd rozszerzenie otrzymuje swoje dane?",
|
||||
bullet1text:
|
||||
"Kombinacja danych zarchiwizowanych przed wyłączeniem oficjalnego API do łapek w dół, oraz ekstrapolowane zachowania użytkowników rozszerzenia.",
|
||||
bullet2: "Dlaczego licznik łapek w dół się nie aktualizuje?",
|
||||
bullet2text:
|
||||
"Na chwilę obecną łapki w dół są buforowane i nie są często aktualizowane. Zależy to od popularności filmu, jednak może to zająć klika godzin lub kilka dni żeby licznik został zaktualizowany. ",
|
||||
bullet3: "Jak to działa?",
|
||||
bullet3text:
|
||||
"Rozszerzenie pobiera ID filmu, który oglądasz, a następnie używając naszego API pobiera liczbę łapek w dół (oraz inne pola, takie jak wyświetlenia, łapki w górę itd.). Rozszerzenie potem wyświetla liczbę łapek w dół oraz proporcje łapek na stronie. Jeżeli dasz filmowi łapkę w górę bądź w dół, ta akcja zostanie zarejestrowana i wysłana do bazy danych, aby dokonać ekstrapolacji dokładnej liczby łapek w dół.",
|
||||
bullet4: "Czy mogę Wam udostępnić liczbę łapek w dół na moich filmach?",
|
||||
bullet4text:
|
||||
"Wkrótce. Przyglądamy się możliwościom użycia OAuth lub innego klucza API tylko do odczytu z ograniczonym zakresem, aby twórcy mogli udostępniać zweryfikowaną liczbę swoich łapek w dół.",
|
||||
bullet5: "Jakie dane zbieracie i co z nimi robicie?",
|
||||
bullet5text:
|
||||
'Rozszerzenie zbiera tylko dane wymagane do poprawnego działania, takie jak adres IP lub ID oglądanego filmu. Dane te nigdy nie będą sprzedane osobom trzecim. Jeżeli chcesz przeczytać więcej o tym, jak radzimy sobie z bezpieczeństwem i prywatnością, sprawdź nasze <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">FAQ bezpieczeństwa</a>.',
|
||||
bullet6: "Jak działa API/Backend?",
|
||||
bullet6text:
|
||||
"Backend używa danych zarchiwizowanych w momencie, gdy API YouTube wciąż zwracało liczby łapek w dół, oraz danych zebranych i ekstrapolowanych od użytkowników rozszerzenia. W niedalekiej przyszłości pozwolimy twórcom łatwo i bezpieczne udostępniać swoje liczniki łapek w dół oraz będziemy dodawać dane zarchiwizowane przez ArchiveTeam (4,56 miliardów filmów) do naszej bazy danych. Można też obejrzeć film na ten temat. ",
|
||||
bullet7: "Dlaczego licznik łapek w dół pokazuje 'WYŁĄCZONE PRZEZ TWÓRCĘ'?",
|
||||
bullet7text:
|
||||
"Czasami świeżo wrzucony film pokazuje 'WYŁĄCZONE PRZEZ TWÓRCĘ' nawet wtedy, gdy twórca nie wyłączył łapek. Jest to spowodowane naszym sposobem wykrywania wyłączonych łapek, powinno zniknąć za parę godzin, albo po oddaniu łapki i odświeżeniu strony (oby).",
|
||||
},
|
||||
donate: {
|
||||
name: "Wesprzyj",
|
||||
subtitle:
|
||||
"Możesz wesprzeć pieniężnie nasze starania w utrzymaniu wolnego internetu!",
|
||||
},
|
||||
links: {
|
||||
name: "Linki",
|
||||
title: "Linki projektu",
|
||||
subtitle: "Linki do projektu i ich developerów",
|
||||
contact: "Skontaktuj się ze mną",
|
||||
translators: "Tłumacze",
|
||||
coolProjects: "Fajne projekty",
|
||||
sponsorBlockDescription: "Pomiń reklamy zintegrowane z filmem",
|
||||
filmotDescription: "Wyszukaj filmy na YouTube po napisach",
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,117 @@
|
||||
import { pt_BR } from "vuetify/src/locale";
|
||||
// by Unnamed-orbert
|
||||
export default {
|
||||
...pt_BR,
|
||||
home: {
|
||||
name: "Inicio",
|
||||
title: "Return YouTube Dislike",
|
||||
subtitle: "Esta extensão de navegador usando a nossa APU irá mostra seus Deslikes no Youtube",
|
||||
ukraine: "Ajuda a Ucrania",
|
||||
sponsors: "Patrocinaores",
|
||||
},
|
||||
install: {
|
||||
name: "Instalação",
|
||||
title: "Selecione sua plataforma",
|
||||
subtitle: "Disponivel para Firefox e tidos navegadores Chromium",
|
||||
title2: "Outras Plataformas",
|
||||
subtitle2: "Se seu navegador não suportar isso, tente usa um UserScript",
|
||||
title3: "Implementação de terceiro",
|
||||
subtitle3: "Não nós garantimos com isso, use por sua conta e risco!",
|
||||
},
|
||||
api: {
|
||||
name: "API",
|
||||
title: "Bem-vindo aos documentos oficiais de RYD!",
|
||||
subtitle: "Para começar, selecione um seletor o menu.",
|
||||
rights: {
|
||||
title: "Direitos de uso",
|
||||
subtitle:
|
||||
"Third party use of this open API is allowed with the following restrictions:",
|
||||
bullet1: "Attribution: ",
|
||||
bullet1text:
|
||||
"This project should be clearly attributed with either a link to this repo or a link to returnyoutubedislike.com",
|
||||
bullet2: "Rate Limiting: ",
|
||||
bullet2text:
|
||||
"There are per client rate limits in place of 100 per minute and 10,000 per day. This will return a 429 status code indicating that your application should back off",
|
||||
},
|
||||
url: {
|
||||
title: "Informação da URL",
|
||||
subtitle: "A API é acessivel seguindo o URL base: ",
|
||||
},
|
||||
endpoints: {
|
||||
title: "Available Endpoints",
|
||||
subtitle: "List of available endpoints is available here: ",
|
||||
},
|
||||
fetching: {
|
||||
title: "Basic Fetching Tutorial",
|
||||
subtitle: "Example to get votes of a given YouTube video ID: ",
|
||||
title2: "Examplo de Requesitação : ",
|
||||
url: "URL de requisitação: ",
|
||||
method: "Metodo de solicitação: ",
|
||||
headers: "Cabeçalhos: ",
|
||||
response: "Resposta: ",
|
||||
error1: 'Isso é um ID do youtube invalido retornando o codigo 404 "não encontrado"',
|
||||
error2: 'Isso é um ID do youtube mal formatada retornando o codigo 400 "Solicitação ruim"',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
name: "Ajuda",
|
||||
title: "Troubleshooting",
|
||||
bullet1: "Make sure you have latest version of extension installed, ",
|
||||
bullet11: "right now",
|
||||
bullet2: "Tente remover a extensão e instalar novamente, ou tente reiniciar o navegador",
|
||||
bullet3: "Faça isso abrindo este link:",
|
||||
bullet31: "you should see plain text: ",
|
||||
bullet4: "Se não encontrou um ajuda - reporte seu problema no ",
|
||||
bullet41: "na nossa",
|
||||
bullet4a: "Diga-nós o seu sistema operacional, navegador e Versão do navegador",
|
||||
bullet4b:
|
||||
"Take a screenshot of the page with the problem (i.e. Youtube video page) with the console open (press ",
|
||||
bullet4b1: ") - example screenshot below.",
|
||||
bullet4c:
|
||||
"Take a screenshot of the extensions page of your browser with the extension installed.",
|
||||
bullet4c1: "Veja as extensões put essa into barra de endereço: ",
|
||||
firefox: "para Firefox",
|
||||
chrome: "para Chrome, Edge, Brave, Opera e Vivaldi",
|
||||
},
|
||||
faq: {
|
||||
name: "FAQ",
|
||||
title: "Pergunta feitas com Frequencia",
|
||||
subtitle: "Ainda tem perguntas? Sinta-se livre para nós acompanhar no Discord!",
|
||||
bullet1: "Quais dados a extensão obtem Where does the extension get its data?",
|
||||
bullet1text:
|
||||
"A combination of archived data from before the official YouTube dislike API shut down, and extrapolated extension user behavior.",
|
||||
bullet2: "Por que a contagem de deslike não está atualizando?",
|
||||
bullet2text:
|
||||
"Right now video dislikes are cached and they aren't updated very frequently. It varies depending on a video's popularity but can take anywhere between a few hours and a few days to update.",
|
||||
bullet3: "Como isso funciona?",
|
||||
bullet3text:
|
||||
"The extension collects the video ID of the video you are watching, and fetches the number of dislikes (and other fields like views, likes etc) using our API. The extension then displays the dislike count and ratio on the page. If you like or dislike a video, that is recorded and sent to the database so an accurate dislike count can be extrapolated.",
|
||||
bullet4: "Eu posso compartilha a contador de deslike com você?",
|
||||
bullet4text:
|
||||
"Coming soon. We are looking into using Oauth or a different read only API with a limited scope so creators can share their dislike counts verifiability.",
|
||||
bullet5: "Quais os dados que vocs coletam para fazer isso funcionar?",
|
||||
bullet5text:
|
||||
'A extensão apenas coleta os dados extritamente necessaria para o funcionamento proprietario, como o seu endereço de IP e ID do video que vocês atualmente assistindo. None of your data will ever be sold to 3rd parties. If you would like to know more about how we handle security and privacy check out our <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">security FAQ</a>.',
|
||||
bullet6: "How does the API/Backend work?",
|
||||
bullet6text:
|
||||
"The backend is using archived data from when the youtube api was still returning the dislike count, extension users like/dislike count and extrapolation. In the near future we will be allowing content creators to submit their dislike count easily and safely and we will be adding ArchiveTeam's archived data (4.56 billion videos) into our current database. You can also view a video on the topic.",
|
||||
bullet7: "Why does the dislike count show 'DISLIKES DISABLED'?",
|
||||
bullet7text:
|
||||
"Sometimes a recently uploaded video might show 'DISLIKES DISABLED' even if the creator hasn't disabled it, this is due to how we are detecting if dislikes are disabled, it should go away in a few hours or by liking or disliking the video and refreshing the page (hopefully).",
|
||||
},
|
||||
donate: {
|
||||
name: "Doe",
|
||||
subtitle:
|
||||
"Você pode nós ajuda a melhora sua experiencia na internet com uma doação!",
|
||||
},
|
||||
links: {
|
||||
name: "Links",
|
||||
title: "Links de Projetos",
|
||||
subtitle: "Links para o projeto e outros desenvolvedores",
|
||||
contact: "Entre em Contato comigo (Only English, please!)",
|
||||
translators: "Tradutores",
|
||||
coolProjects: "Projetos de Qualidade",
|
||||
sponsorBlockDescription: "Pule propagangas integradas nos videos",
|
||||
filmotDescription: "Pesquise videos do YouTube pelas Legandas",
|
||||
},
|
||||
};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user