diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..075bf5ab --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,38 @@ +name: Create markdown list + +on: + pull_request: + branches: "*" + paths: + - 'instances.yaml' + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + + - name: Setup python + uses: actions/setup-python@v2 + with: + python-version: 3.9.5 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r src/requirements.txt + + - name: Create markdown instance list + run: | + python src/create-instance-md.py + + # Auto commit resulting md file + - name: "Auto commiting resulting markdown instance list" + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Update Invidious-Instances.md + file_pattern: Invidious-Instances.md \ No newline at end of file diff --git a/Invidious-Instances.md b/Invidious-Instances.md index 77f82a8d..9ba7b7f7 100644 --- a/Invidious-Instances.md +++ b/Invidious-Instances.md @@ -1,62 +1,59 @@ ---- -title: Invidious-Instances -description: -published: true -date: 2021-05-23T16:58:51.441Z -tags: -editor: markdown -dateCreated: 2021-05-23T16:58:48.431Z ---- -# Public Invidious Instances: -[Uptime History provided by Uptimerobot](https://stats.uptimerobot.com/89VnzSKAn) -[Instances API](https://instances.invidio.us/) +# Public Instances -**Note:** -Instances using Cloudflare are marked as such. Instances using any type of anti-bot protection are marked as such. +Uptime History: [stats.uptimerobot.com/89VnzSKAn](https://stats.uptimerobot.com/89VnzSKAn) -Instances using any type of analytics are marked as such, must be GDPR compliant (if it's usable in the EU), must be CCPA compliant (if it's usable in California), and must respect the AGPL by explaining their changes and by publishing their source code. In short: instances shouldn't run analytics, because it's not worth it. +Instances API: [api.invidious.io](https://instances.invidious.io) +# Instances list + -To be in this list, instances must have been updated in the last month. An instance that hasn't been updated in the last month is considered unmaintained and will be removed from the list. +|Address|Country|Status|Privacy policy|DDos Protection / MITM|Owner|Modified| +| :---: | :---: | :---: | :---: | :---: | :---: | :---: | +|[invidious.snopyta.org](https://invidious.snopyta.org)|🇫🇮 Finland|https://status.unixfox.eu/783898765|[Here](https://snopyta.org/privacy_policy)||[@Perflyst](https://github.com/Perflyst)|No| +|[yewtu.be](https://yewtu.be)|🇫🇷 France||||[@unixfox](https://github.com/unixfox)|No| +|[invidious.kavin.rocks](https://invidious.kavin.rocks)|🇮🇳 India|https://status.kavin.rocks/786132664||Cloudflare|[@FireMasterK](https://github.com/FireMasterK)|No| +|[invidious-us.kavin.rocks](https://invidious-us.kavin.rocks)|🇺🇸 USA|https://status.kavin.rocks/788216947||Cloudflare|[@FireMasterK](https://github.com/FireMasterK)|No| +|[invidious.048596.xyz](https://invidious.048596.xyz)|🇨🇦 Canada|https://status.048596.xyz/786792286|||[@tenpura-shrimp](https://github.com/tenpura-shrimp)|No| +|[vid.puffyan.us](https://vid.puffyan.us)|🇺🇸 USA|https://stats.uptimerobot.com/n7A08HGVl6/786947233|||[@ItsSt0ne](https://github.com/ItsSt0ne)|No| +|[ytprivate.com](https://ytprivate.com)|🇺🇸 USA|https://status.ytprivate.com/786947505||DDoS-Guard|[@ytprivatecom](https://github.com/ytprivatecom)|[Yes](https://github.com/ytprivatecom/invidious)| +|[invidious.namazso.eu](https://invidious.namazso.eu)|🇩🇪 Germany||[Here](https://namazso.eu/privacy.html)||[@namazso](https://github.com/namazso)|No| +|[invidious.silkky.cloud](https://invidious.silkky.cloud)|🇫🇮 Finland|https://status.silkky.cloud/787784614|||[@TheSilkky](https://github.com/TheSilkky)|No| +|[invidious.exonip.de](https://invidious.exonip.de)|🇩🇪 Germany|https://status.exonip.de|||[@Exonip](https://github.com/Exonip)|No| +|[notyoutube.org](https://notyoutube.org)|🇫🇮 Finland||||[@Eggo-Plant](https://github.com/Eggo-Plant)|No| +|[inv.riverside.rocks](https://inv.riverside.rocks)|🇺🇸 USA||||[@RiversideRocks](https://github.com/RiversideRocks)|No| +|[invidious.blamefran.net](https://invidious.blamefran.net)|🇺🇸 USA||||[@Aidan16](https://github.com/Aidan16)|No| +# Tor onion instances list + -## List of public Invidious Instances (sorted from oldest to newest): +|Address|Country|Associated clearnet instance|Privacy policy|Owner|Modified| +| :---: | :---: | :---: | :---: | :---: | :---: | +|[c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion](http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion)|||||No| +|[w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion](http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion/)|||||No| +|[kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion](http://kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion/)|🇳🇱 Netherlands||||No| +|[grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion](http://grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion/)|🇺🇸 USA||||No| +|[hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid.onion](http://hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid.onion/)|🇺🇸 USA|https://invidious.kavin.rocks||[@FireMasterK](https://github.com/FireMasterK)|No| -* [invidious.snopyta.org](https://invidious.snopyta.org/) 🇫🇮 +# Adding your instance -* [yewtu.be](https://yewtu.be) 🇫🇷 [![Uptime Robot status](https://img.shields.io/uptimerobot/status/m783898765-2a4efa67aa8d1c7be6b1dd9d)](https://status.unixfox.eu/783898765) +## Prerequisites -* [invidious.kavin.rocks](https://invidious.kavin.rocks) 🇮🇳 [![Uptime Robot status](https://img.shields.io/uptimerobot/status/m786132664-f9fa738fba1c4dc2f7364f71)](https://status.kavin.rocks/786132664) [invidious-us.kavin.rocks](https://invidious-us.kavin.rocks) 🇺🇸 [![Uptime Robot status](https://img.shields.io/uptimerobot/status/m788216947-f3f63d30899a10dbe9a0338a)](https://status.kavin.rocks/788216947) (uses Cloudflare) +- Instances must have been updated in the last month. An instance that hasn't been updated in the last month is considered unmaintained and is removed from the list +- Instances must have statistics (/api/v1/stats) enabled (`statistics_enabled:true` in the configuration file). +- Instances must be served via domain name. +- Instances must be served via HTTPS. +- Instances using any DDoS Protection / MITM are marked as such. +- Instances using any type of anti-bot protection are marked as such. +- Instances using any type of analytics are marked as such, must be GDPR compliant (if it's usable in the EU), must be CCPA compliant (if it's usable in California), and must respect the AGPL by explaining their changes and by publishing their source code. In short: instances shouldn't run analytics, because it's not worth it. + -* [invidious.048596.xyz](https://invidious.048596.xyz/) 🇨🇦 [![Uptime Robot status](https://img.shields.io/uptimerobot/status/m786792286-b5894e4e11c42b8332375076)](https://status.048596.xyz/786792286) +## Directions -* [vid.puffyan.us](https://vid.puffyan.us) 🇺🇸 [![Uptime Robot status](https://img.shields.io/uptimerobot/status/m786947233-1131c3f67b9a20621b1926d3?style=plastic)](https://stats.uptimerobot.com/n7A08HGVl6/786947233) - -* [ytprivate.com](https://ytprivate.com) 🇺🇸 [![Uptime Robot status](https://img.shields.io/uptimerobot/status/m786947505-2a50cf3262906bb28c6cf8fc)](https://status.ytprivate.com/786947505) (uses DDoS-Guard) (is running a modified source code) - Source Code: https://github.com/ytprivatecom/invidious - Changes: https://github.com/ytprivatecom/invidious#source-changes - -* [invidious.namazso.eu](https://invidious.namazso.eu) 🇩🇪 - -* [invidious.silkky.cloud](https://invidious.silkky.cloud) 🇫🇮 [![Uptime Robot status](https://img.shields.io/uptimerobot/status/m787784614-79d1acc4b425d1ed813fc793)](https://status.silkky.cloud/787784614) - -* [invidious.exonip.de](https://invidious.exonip.de) 🇩🇪 [Uptime Robot status](https://status.exonip.de/) - -* [notyoutube.org](https://notyoutube.org) 🇫🇮 - -* [inv.riverside.rocks](https://inv.riverside.rocks) 🇺🇸 - -* [invidious.blamefran.net](https://invidious.blamefran.net) 🇺🇸 - -### Tor Onion Services: -* [c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion](http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion) - -* [w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion](http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion/) - -* [kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion](http://kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion/) 🇳🇱 - -* [grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion](http://grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion) 🇺🇸 - -* [hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid.onion](http://hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid.onion) 🇺🇸 (Onion of invidious-us.kavin.rocks) +1. Fork the documentation repo. +2. Open `instances.yaml` for editing. +3. Append your instance to the bottom of the HTTPS (or onion) list. See the examples in the yaml file for more info +4. Make a pull request. diff --git a/instances.yaml b/instances.yaml new file mode 100644 index 00000000..32706256 --- /dev/null +++ b/instances.yaml @@ -0,0 +1,234 @@ +https: + # Template instance + # - url: example.com + # country: + # flag: 🇫🇮 + # name: Finland + # status_url: status.example.com + # privacy_policy: privacy.example.com + # ddos_mitm_protection: Cloudflare + # owner: https://github.com/example + # modified: + # is_modified: False + # source_url: null + + + - url: https://invidious.snopyta.org + country: + flag: 🇫🇮 + name: Finland + status_url: https://status.unixfox.eu/783898765 + privacy_policy: https://snopyta.org/privacy_policy + ddos_mitm_protection: null + owner: https://github.com/Perflyst + modified: + is_modified: False + source_url: null + + - url: https://yewtu.be + country: + flag: 🇫🇷 + name: France + status_url: null + privacy_policy: null + ddos_mitm_protection: null + owner: https://github.com/unixfox + modified: + is_modified: False + source_url: null + + - url: https://invidious.kavin.rocks + country: + flag: 🇮🇳 + name: India + status_url: https://status.kavin.rocks/786132664 + privacy_policy: + ddos_mitm_protection: Cloudflare + owner: https://github.com/FireMasterK + modified: + is_modified: False + source_url: null + + - url: https://invidious-us.kavin.rocks + country: + flag: 🇺🇸 + name: USA + status_url: https://status.kavin.rocks/788216947 + privacy_policy: + ddos_mitm_protection: Cloudflare + owner: https://github.com/FireMasterK + modified: + is_modified: False + source_url: null + + - url: https://invidious.048596.xyz + country: + flag: 🇨🇦 + name: Canada + status_url: https://status.048596.xyz/786792286 + privacy_policy: + ddos_mitm_protection: + owner: https://github.com/tenpura-shrimp + modified: + is_modified: False + source_url: null + + - url: https://vid.puffyan.us + country: + flag: 🇺🇸 + name: USA + status_url: https://stats.uptimerobot.com/n7A08HGVl6/786947233 + privacy_policy: + ddos_mitm_protection: + owner: https://github.com/ItsSt0ne + modified: + is_modified: False + source_url: null + + - url: https://ytprivate.com + country: + flag: 🇺🇸 + name: USA + status_url: https://status.ytprivate.com/786947505 + privacy_policy: + ddos_mitm_protection: DDoS-Guard + owner: https://github.com/ytprivatecom + modified: + is_modified: True + source_url: https://github.com/ytprivatecom/invidious + + - url: https://invidious.namazso.eu + country: + flag: 🇩🇪 + name: Germany + status_url: + privacy_policy: https://namazso.eu/privacy.html + ddos_mitm_protection: + owner: https://github.com/namazso + modified: + is_modified: False + source_url: null + + - url: https://invidious.silkky.cloud + country: + flag: 🇫🇮 + name: Finland + status_url: https://status.silkky.cloud/787784614 + privacy_policy: + ddos_mitm_protection: + owner: https://github.com/TheSilkky + modified: + is_modified: False + source_url: null + + - url: https://invidious.exonip.de + country: + flag: 🇩🇪 + name: Germany + status_url: https://status.exonip.de + privacy_policy: + ddos_mitm_protection: + owner: https://github.com/Exonip + modified: + is_modified: False + source_url: null + + - url: https://notyoutube.org + country: + flag: 🇫🇮 + name: Finland + status_url: + privacy_policy: + ddos_mitm_protection: + owner: https://github.com/Eggo-Plant + modified: + is_modified: False + source_url: null + + - url: https://inv.riverside.rocks + country: + flag: 🇺🇸 + name: USA + status_url: + privacy_policy: + ddos_mitm_protection: + owner: https://github.com/RiversideRocks + modified: + is_modified: False + source_url: null + + - url: https://invidious.blamefran.net + country: + flag: 🇺🇸 + name: USA + status_url: + privacy_policy: + ddos_mitm_protection: + owner: https://github.com/Aidan16 + modified: + is_modified: False + source_url: null + +onion: + # Template onion instance + # - url: http://example.onion + # country: + # flag: 🇺🇸 + # name: USA + # associated_clearnet_instance: example.com + # privacy_policy: privacy.example.com + # owner: https://github.com/example + # modified: + # is_modified: False + # source_url: null + + - url: http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion + country: + status_url: + privacy_policy: + owner: + modified: + is_modified: False + source_url: null + + - url: http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion/ + country: + associated_clearnet_instance: + privacy_policy: + owner: + modified: + is_modified: False + source_url: null + + - url: http://kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion/ + country: + flag: 🇳🇱 + name: Netherlands + associated_clearnet_instance: + privacy_policy: + owner: + modified: + is_modified: False + source_url: null + + - url: http://grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion/ + country: + flag: 🇺🇸 + name: USA + associated_clearnet_instance: + privacy_policy: + owner: + modified: + is_modified: False + source_url: null + + - url: http://hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid.onion/ + country: + flag: 🇺🇸 + name: USA + associated_clearnet_instance: https://invidious.kavin.rocks + privacy_policy: + owner: https://github.com/FireMasterK + modified: + is_modified: False + source_url: null \ No newline at end of file diff --git a/src/create-instance-md.py b/src/create-instance-md.py new file mode 100644 index 00000000..1d8e987b --- /dev/null +++ b/src/create-instance-md.py @@ -0,0 +1,100 @@ +"""Extremely quick and dirty module for creating a markdown file from the instances.yaml file""" +from urllib.parse import urlparse + +import yaml +from mdutils.mdutils import MdUtils + + +def create_table(table_data, instance_data): + rows = [] + for field, value in instance_data.items(): + if value is None: + rows.append("") + + # Use markdown links for Addresses + elif field == "url": + url = urlparse(value).hostname + rows.append(f"[{url}]({value})") + + elif field == "country" and value: + rows.append(f"{value['flag']} {value['name']}") + + elif field == "modified": + if value["is_modified"] is True: + rows.append(f"[Yes]({value['source_url']})") + else: + rows.append("No") + + # We're going to use a markdown link here + elif field == "privacy_policy": + rows.append(f"[Here]({value})") + + # Handle author name + elif field == "owner": + # Assuming github url + author_name = value.split("/") + rows.append(f"[@{author_name[-1]}]({value})") + else: + rows.append(value) + + table_data.extend(rows) + + +with open("instances.yaml") as instance_yaml_file: + data = yaml.safe_load(instance_yaml_file) + +# Initial information +md_instance_list = MdUtils(file_name='Invidious-Instances.md') +md_instance_list.new_header(level=1, title='Public Instances') +md_instance_list.new_paragraph("Uptime History: [stats.uptimerobot.com/89VnzSKAn](https://stats.uptimerobot.com/89VnzSKAn)") +md_instance_list.new_paragraph("Instances API: [api.invidious.io](https://instances.invidious.io)") + + +# Clearnet instances +md_instance_list.new_header(level=1, title='Instances list') +table_data = ["Address", "Country", "Status", "Privacy policy", "DDos Protection / MITM", "Owner", "Modified"] +for instance_data in data["https"]: + create_table(table_data, instance_data) + +md_instance_list.new_line() +md_instance_list.new_table(columns=7, rows=len(data["https"]) + 1, text=table_data, text_align='center') + + +# Onion instances +md_instance_list.new_header(level=1, title='Tor onion instances list') +table_data = ["Address", "Country", "Associated clearnet instance", "Privacy policy", "Owner", "Modified"] +for instance_data in data["onion"]: + create_table(table_data, instance_data) + +md_instance_list.new_line() +md_instance_list.new_table(columns=6, rows=len(data["onion"]) + 1, text=table_data, text_align='center') + + +# Instance adding directions and prerequisites +md_instance_list.new_header(level=1, title='Adding your instance') + +# Prerequisites +md_instance_list.new_header(level=2, title='Prerequisites') +prerequisites = [ + "Instances must have been updated in the last month. An instance that hasn't been updated in the last month is considered unmaintained and is removed from the list", + "Instances must have statistics (/api/v1/stats) enabled (`statistics_enabled:true` in the configuration file).", + "Instances must be served via domain name.", + "Instances must be served via HTTPS.", + "Instances using any DDoS Protection / MITM are marked as such.", + "Instances using any type of anti-bot protection are marked as such.", + "Instances using any type of analytics are marked as such, must be GDPR compliant (if it's usable in the EU), must be CCPA compliant (if it's usable in California), and must respect the AGPL by explaining their changes and by publishing their source code. In short: instances shouldn't run analytics, because it's not worth it." +] +md_instance_list.new_list(prerequisites) +md_instance_list.new_line() + +# Directions +md_instance_list.new_header(level=2, title='Directions') +directions = [ + "Fork the documentation repo.", + "Open `instances.yaml` for editing.", + "Append your instance to the bottom of the HTTPS (or onion) list. See the examples in the yaml file for more info", + "Make a pull request.", +] +md_instance_list.new_list(directions, marked_with="1") + +md_instance_list.create_md_file() diff --git a/src/requirements.txt b/src/requirements.txt new file mode 100644 index 00000000..9f30f687 --- /dev/null +++ b/src/requirements.txt @@ -0,0 +1,2 @@ +mdutils==1.3.0 +PyYAML==5.4.1