From 5181c2475de501b94b83422850c3d4c0f97cfda4 Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sat, 7 Mar 2026 22:27:57 +1300 Subject: [PATCH 1/8] Bump versions --- materialious/android/app/build.gradle | 4 ++-- materialious/electron/materialious.metainfo.xml | 6 +++++- materialious/electron/package.json | 2 +- materialious/package.json | 4 ++-- update_versions.py | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/materialious/android/app/build.gradle b/materialious/android/app/build.gradle index a867ecd3..b29e87e7 100644 --- a/materialious/android/app/build.gradle +++ b/materialious/android/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "us.materialio.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 229 - versionName "1.16.12" + versionCode 230 + versionName "1.16.13" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/materialious/electron/materialious.metainfo.xml b/materialious/electron/materialious.metainfo.xml index 89d245d8..4f7cacea 100644 --- a/materialious/electron/materialious.metainfo.xml +++ b/materialious/electron/materialious.metainfo.xml @@ -71,7 +71,11 @@ - + + + https://github.com/Materialious/Materialious/releases/tag/1.16.13 + + https://github.com/Materialious/Materialious/releases/tag/1.16.12 diff --git a/materialious/electron/package.json b/materialious/electron/package.json index e23383a7..4381d1a3 100644 --- a/materialious/electron/package.json +++ b/materialious/electron/package.json @@ -1,6 +1,6 @@ { "name": "Materialious", - "version": "1.16.12", + "version": "1.16.13", "description": "Modern material design for YouTube and Invidious.", "author": { "name": "Ward Pearce", diff --git a/materialious/package.json b/materialious/package.json index 5f7f56e7..186ddb7b 100644 --- a/materialious/package.json +++ b/materialious/package.json @@ -1,6 +1,6 @@ { "name": "materialious", - "version": "1.16.12", + "version": "1.16.13", "private": true, "scripts": { "dev": "npm run patch:github && vite dev", @@ -101,4 +101,4 @@ "youtubei.js": "^16.0.1", "zod": "^4.3.6" } -} +} \ No newline at end of file diff --git a/update_versions.py b/update_versions.py index e9bf3666..62fb81f6 100644 --- a/update_versions.py +++ b/update_versions.py @@ -3,7 +3,7 @@ import os import re from datetime import datetime -LATEST_VERSION = "1.16.12" +LATEST_VERSION = "1.16.13" RELEASE_DATE = datetime.now().strftime("%Y-%-m-%d") # Format: YYYY-M-D WORKING_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "materialious") From a489a2ce250731c81e0a292af09f2ffaf00a2055 Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sat, 7 Mar 2026 22:30:57 +1300 Subject: [PATCH 2/8] Added export to file for filters --- .../lib/components/settings/Filters.svelte | 36 ++++++++++++------- .../static/localApi/ghContributors.json | 2 +- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/materialious/src/lib/components/settings/Filters.svelte b/materialious/src/lib/components/settings/Filters.svelte index b62d647c..fbca8d31 100644 --- a/materialious/src/lib/components/settings/Filters.svelte +++ b/materialious/src/lib/components/settings/Filters.svelte @@ -11,6 +11,7 @@ import type z from 'zod'; import { addToast } from '../Toast.svelte'; import { Clipboard } from '@capacitor/clipboard'; + import { downloadStringAsFile } from '$lib/misc'; let remoteFilterListUrl: string = $state($filterContentUrlStore ?? ''); let remoteError: string = $state(''); @@ -48,17 +49,21 @@ } } - async function exportAsJSON() { + function filtersAsJSON() { + return JSON.stringify( + { + version: 'v1', + createdFor: 'materialious', + filterBy: contentFilters + }, + null, + 2 + ); + } + + async function exportToClipboard() { await Clipboard.write({ - string: JSON.stringify( - { - version: 'v1', - createdFor: 'materialious', - filterBy: contentFilters - }, - null, - 2 - ) + string: filtersAsJSON() }); addToast({ @@ -134,9 +139,16 @@ {#if contentFilters} {#if contentFilters.length > 0} - +
{/if} diff --git a/materialious/static/localApi/ghContributors.json b/materialious/static/localApi/ghContributors.json index 32d6898b..959623a2 100644 --- a/materialious/static/localApi/ghContributors.json +++ b/materialious/static/localApi/ghContributors.json @@ -1 +1 @@ -[{"login":"WardPearce","id":27844174,"node_id":"MDQ6VXNlcjI3ODQ0MTc0","avatar_url":"https://avatars.githubusercontent.com/u/27844174?v=4","gravatar_id":"","url":"https://api.github.com/users/WardPearce","html_url":"https://github.com/WardPearce","followers_url":"https://api.github.com/users/WardPearce/followers","following_url":"https://api.github.com/users/WardPearce/following{/other_user}","gists_url":"https://api.github.com/users/WardPearce/gists{/gist_id}","starred_url":"https://api.github.com/users/WardPearce/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WardPearce/subscriptions","organizations_url":"https://api.github.com/users/WardPearce/orgs","repos_url":"https://api.github.com/users/WardPearce/repos","events_url":"https://api.github.com/users/WardPearce/events{/privacy}","received_events_url":"https://api.github.com/users/WardPearce/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2295},{"login":"dependabot[bot]","id":49699333,"node_id":"MDM6Qm90NDk2OTkzMzM=","avatar_url":"https://avatars.githubusercontent.com/in/29110?v=4","gravatar_id":"","url":"https://api.github.com/users/dependabot%5Bbot%5D","html_url":"https://github.com/apps/dependabot","followers_url":"https://api.github.com/users/dependabot%5Bbot%5D/followers","following_url":"https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dependabot%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/dependabot%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/dependabot%5Bbot%5D/repos","events_url":"https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/dependabot%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false,"contributions":241},{"login":"Lezurex","id":48829956,"node_id":"MDQ6VXNlcjQ4ODI5OTU2","avatar_url":"https://avatars.githubusercontent.com/u/48829956?v=4","gravatar_id":"","url":"https://api.github.com/users/Lezurex","html_url":"https://github.com/Lezurex","followers_url":"https://api.github.com/users/Lezurex/followers","following_url":"https://api.github.com/users/Lezurex/following{/other_user}","gists_url":"https://api.github.com/users/Lezurex/gists{/gist_id}","starred_url":"https://api.github.com/users/Lezurex/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Lezurex/subscriptions","organizations_url":"https://api.github.com/users/Lezurex/orgs","repos_url":"https://api.github.com/users/Lezurex/repos","events_url":"https://api.github.com/users/Lezurex/events{/privacy}","received_events_url":"https://api.github.com/users/Lezurex/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":44},{"login":"ghostofsparta222","id":251893418,"node_id":"U_kgDODwOWqg","avatar_url":"https://avatars.githubusercontent.com/u/251893418?v=4","gravatar_id":"","url":"https://api.github.com/users/ghostofsparta222","html_url":"https://github.com/ghostofsparta222","followers_url":"https://api.github.com/users/ghostofsparta222/followers","following_url":"https://api.github.com/users/ghostofsparta222/following{/other_user}","gists_url":"https://api.github.com/users/ghostofsparta222/gists{/gist_id}","starred_url":"https://api.github.com/users/ghostofsparta222/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ghostofsparta222/subscriptions","organizations_url":"https://api.github.com/users/ghostofsparta222/orgs","repos_url":"https://api.github.com/users/ghostofsparta222/repos","events_url":"https://api.github.com/users/ghostofsparta222/events{/privacy}","received_events_url":"https://api.github.com/users/ghostofsparta222/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":15},{"login":"Coool","id":8421903,"node_id":"MDQ6VXNlcjg0MjE5MDM=","avatar_url":"https://avatars.githubusercontent.com/u/8421903?v=4","gravatar_id":"","url":"https://api.github.com/users/Coool","html_url":"https://github.com/Coool","followers_url":"https://api.github.com/users/Coool/followers","following_url":"https://api.github.com/users/Coool/following{/other_user}","gists_url":"https://api.github.com/users/Coool/gists{/gist_id}","starred_url":"https://api.github.com/users/Coool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Coool/subscriptions","organizations_url":"https://api.github.com/users/Coool/orgs","repos_url":"https://api.github.com/users/Coool/repos","events_url":"https://api.github.com/users/Coool/events{/privacy}","received_events_url":"https://api.github.com/users/Coool/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":15},{"login":"araujosemacento","id":60983392,"node_id":"MDQ6VXNlcjYwOTgzMzky","avatar_url":"https://avatars.githubusercontent.com/u/60983392?v=4","gravatar_id":"","url":"https://api.github.com/users/araujosemacento","html_url":"https://github.com/araujosemacento","followers_url":"https://api.github.com/users/araujosemacento/followers","following_url":"https://api.github.com/users/araujosemacento/following{/other_user}","gists_url":"https://api.github.com/users/araujosemacento/gists{/gist_id}","starred_url":"https://api.github.com/users/araujosemacento/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/araujosemacento/subscriptions","organizations_url":"https://api.github.com/users/araujosemacento/orgs","repos_url":"https://api.github.com/users/araujosemacento/repos","events_url":"https://api.github.com/users/araujosemacento/events{/privacy}","received_events_url":"https://api.github.com/users/araujosemacento/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":14},{"login":"toolatebot","id":169580663,"node_id":"U_kgDOChuYdw","avatar_url":"https://avatars.githubusercontent.com/u/169580663?v=4","gravatar_id":"","url":"https://api.github.com/users/toolatebot","html_url":"https://github.com/toolatebot","followers_url":"https://api.github.com/users/toolatebot/followers","following_url":"https://api.github.com/users/toolatebot/following{/other_user}","gists_url":"https://api.github.com/users/toolatebot/gists{/gist_id}","starred_url":"https://api.github.com/users/toolatebot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/toolatebot/subscriptions","organizations_url":"https://api.github.com/users/toolatebot/orgs","repos_url":"https://api.github.com/users/toolatebot/repos","events_url":"https://api.github.com/users/toolatebot/events{/privacy}","received_events_url":"https://api.github.com/users/toolatebot/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":9},{"login":"Precific","id":30053082,"node_id":"MDQ6VXNlcjMwMDUzMDgy","avatar_url":"https://avatars.githubusercontent.com/u/30053082?v=4","gravatar_id":"","url":"https://api.github.com/users/Precific","html_url":"https://github.com/Precific","followers_url":"https://api.github.com/users/Precific/followers","following_url":"https://api.github.com/users/Precific/following{/other_user}","gists_url":"https://api.github.com/users/Precific/gists{/gist_id}","starred_url":"https://api.github.com/users/Precific/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Precific/subscriptions","organizations_url":"https://api.github.com/users/Precific/orgs","repos_url":"https://api.github.com/users/Precific/repos","events_url":"https://api.github.com/users/Precific/events{/privacy}","received_events_url":"https://api.github.com/users/Precific/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":9},{"login":"yzqzss","id":30341059,"node_id":"MDQ6VXNlcjMwMzQxMDU5","avatar_url":"https://avatars.githubusercontent.com/u/30341059?v=4","gravatar_id":"","url":"https://api.github.com/users/yzqzss","html_url":"https://github.com/yzqzss","followers_url":"https://api.github.com/users/yzqzss/followers","following_url":"https://api.github.com/users/yzqzss/following{/other_user}","gists_url":"https://api.github.com/users/yzqzss/gists{/gist_id}","starred_url":"https://api.github.com/users/yzqzss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yzqzss/subscriptions","organizations_url":"https://api.github.com/users/yzqzss/orgs","repos_url":"https://api.github.com/users/yzqzss/repos","events_url":"https://api.github.com/users/yzqzss/events{/privacy}","received_events_url":"https://api.github.com/users/yzqzss/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"thejenja","id":65224669,"node_id":"MDQ6VXNlcjY1MjI0NjY5","avatar_url":"https://avatars.githubusercontent.com/u/65224669?v=4","gravatar_id":"","url":"https://api.github.com/users/thejenja","html_url":"https://github.com/thejenja","followers_url":"https://api.github.com/users/thejenja/followers","following_url":"https://api.github.com/users/thejenja/following{/other_user}","gists_url":"https://api.github.com/users/thejenja/gists{/gist_id}","starred_url":"https://api.github.com/users/thejenja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thejenja/subscriptions","organizations_url":"https://api.github.com/users/thejenja/orgs","repos_url":"https://api.github.com/users/thejenja/repos","events_url":"https://api.github.com/users/thejenja/events{/privacy}","received_events_url":"https://api.github.com/users/thejenja/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"cookiennn","id":114363954,"node_id":"U_kgDOBtEOMg","avatar_url":"https://avatars.githubusercontent.com/u/114363954?v=4","gravatar_id":"","url":"https://api.github.com/users/cookiennn","html_url":"https://github.com/cookiennn","followers_url":"https://api.github.com/users/cookiennn/followers","following_url":"https://api.github.com/users/cookiennn/following{/other_user}","gists_url":"https://api.github.com/users/cookiennn/gists{/gist_id}","starred_url":"https://api.github.com/users/cookiennn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cookiennn/subscriptions","organizations_url":"https://api.github.com/users/cookiennn/orgs","repos_url":"https://api.github.com/users/cookiennn/repos","events_url":"https://api.github.com/users/cookiennn/events{/privacy}","received_events_url":"https://api.github.com/users/cookiennn/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"SecularSteve","id":33793273,"node_id":"MDQ6VXNlcjMzNzkzMjcz","avatar_url":"https://avatars.githubusercontent.com/u/33793273?v=4","gravatar_id":"","url":"https://api.github.com/users/SecularSteve","html_url":"https://github.com/SecularSteve","followers_url":"https://api.github.com/users/SecularSteve/followers","following_url":"https://api.github.com/users/SecularSteve/following{/other_user}","gists_url":"https://api.github.com/users/SecularSteve/gists{/gist_id}","starred_url":"https://api.github.com/users/SecularSteve/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SecularSteve/subscriptions","organizations_url":"https://api.github.com/users/SecularSteve/orgs","repos_url":"https://api.github.com/users/SecularSteve/repos","events_url":"https://api.github.com/users/SecularSteve/events{/privacy}","received_events_url":"https://api.github.com/users/SecularSteve/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"R0GGER","id":8298741,"node_id":"MDQ6VXNlcjgyOTg3NDE=","avatar_url":"https://avatars.githubusercontent.com/u/8298741?v=4","gravatar_id":"","url":"https://api.github.com/users/R0GGER","html_url":"https://github.com/R0GGER","followers_url":"https://api.github.com/users/R0GGER/followers","following_url":"https://api.github.com/users/R0GGER/following{/other_user}","gists_url":"https://api.github.com/users/R0GGER/gists{/gist_id}","starred_url":"https://api.github.com/users/R0GGER/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/R0GGER/subscriptions","organizations_url":"https://api.github.com/users/R0GGER/orgs","repos_url":"https://api.github.com/users/R0GGER/repos","events_url":"https://api.github.com/users/R0GGER/events{/privacy}","received_events_url":"https://api.github.com/users/R0GGER/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"arcoast","id":81871508,"node_id":"MDQ6VXNlcjgxODcxNTA4","avatar_url":"https://avatars.githubusercontent.com/u/81871508?v=4","gravatar_id":"","url":"https://api.github.com/users/arcoast","html_url":"https://github.com/arcoast","followers_url":"https://api.github.com/users/arcoast/followers","following_url":"https://api.github.com/users/arcoast/following{/other_user}","gists_url":"https://api.github.com/users/arcoast/gists{/gist_id}","starred_url":"https://api.github.com/users/arcoast/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arcoast/subscriptions","organizations_url":"https://api.github.com/users/arcoast/orgs","repos_url":"https://api.github.com/users/arcoast/repos","events_url":"https://api.github.com/users/arcoast/events{/privacy}","received_events_url":"https://api.github.com/users/arcoast/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"coolvitto","id":160416811,"node_id":"U_kgDOCY_EKw","avatar_url":"https://avatars.githubusercontent.com/u/160416811?v=4","gravatar_id":"","url":"https://api.github.com/users/coolvitto","html_url":"https://github.com/coolvitto","followers_url":"https://api.github.com/users/coolvitto/followers","following_url":"https://api.github.com/users/coolvitto/following{/other_user}","gists_url":"https://api.github.com/users/coolvitto/gists{/gist_id}","starred_url":"https://api.github.com/users/coolvitto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/coolvitto/subscriptions","organizations_url":"https://api.github.com/users/coolvitto/orgs","repos_url":"https://api.github.com/users/coolvitto/repos","events_url":"https://api.github.com/users/coolvitto/events{/privacy}","received_events_url":"https://api.github.com/users/coolvitto/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"maboroshin","id":41102508,"node_id":"MDQ6VXNlcjQxMTAyNTA4","avatar_url":"https://avatars.githubusercontent.com/u/41102508?v=4","gravatar_id":"","url":"https://api.github.com/users/maboroshin","html_url":"https://github.com/maboroshin","followers_url":"https://api.github.com/users/maboroshin/followers","following_url":"https://api.github.com/users/maboroshin/following{/other_user}","gists_url":"https://api.github.com/users/maboroshin/gists{/gist_id}","starred_url":"https://api.github.com/users/maboroshin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maboroshin/subscriptions","organizations_url":"https://api.github.com/users/maboroshin/orgs","repos_url":"https://api.github.com/users/maboroshin/repos","events_url":"https://api.github.com/users/maboroshin/events{/privacy}","received_events_url":"https://api.github.com/users/maboroshin/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"pinembour","id":15938873,"node_id":"MDQ6VXNlcjE1OTM4ODcz","avatar_url":"https://avatars.githubusercontent.com/u/15938873?v=4","gravatar_id":"","url":"https://api.github.com/users/pinembour","html_url":"https://github.com/pinembour","followers_url":"https://api.github.com/users/pinembour/followers","following_url":"https://api.github.com/users/pinembour/following{/other_user}","gists_url":"https://api.github.com/users/pinembour/gists{/gist_id}","starred_url":"https://api.github.com/users/pinembour/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pinembour/subscriptions","organizations_url":"https://api.github.com/users/pinembour/orgs","repos_url":"https://api.github.com/users/pinembour/repos","events_url":"https://api.github.com/users/pinembour/events{/privacy}","received_events_url":"https://api.github.com/users/pinembour/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"lamarios","id":1192563,"node_id":"MDQ6VXNlcjExOTI1NjM=","avatar_url":"https://avatars.githubusercontent.com/u/1192563?v=4","gravatar_id":"","url":"https://api.github.com/users/lamarios","html_url":"https://github.com/lamarios","followers_url":"https://api.github.com/users/lamarios/followers","following_url":"https://api.github.com/users/lamarios/following{/other_user}","gists_url":"https://api.github.com/users/lamarios/gists{/gist_id}","starred_url":"https://api.github.com/users/lamarios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lamarios/subscriptions","organizations_url":"https://api.github.com/users/lamarios/orgs","repos_url":"https://api.github.com/users/lamarios/repos","events_url":"https://api.github.com/users/lamarios/events{/privacy}","received_events_url":"https://api.github.com/users/lamarios/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"bonswouar","id":615053,"node_id":"MDQ6VXNlcjYxNTA1Mw==","avatar_url":"https://avatars.githubusercontent.com/u/615053?v=4","gravatar_id":"","url":"https://api.github.com/users/bonswouar","html_url":"https://github.com/bonswouar","followers_url":"https://api.github.com/users/bonswouar/followers","following_url":"https://api.github.com/users/bonswouar/following{/other_user}","gists_url":"https://api.github.com/users/bonswouar/gists{/gist_id}","starred_url":"https://api.github.com/users/bonswouar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bonswouar/subscriptions","organizations_url":"https://api.github.com/users/bonswouar/orgs","repos_url":"https://api.github.com/users/bonswouar/repos","events_url":"https://api.github.com/users/bonswouar/events{/privacy}","received_events_url":"https://api.github.com/users/bonswouar/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"Makhuta","id":23267923,"node_id":"MDQ6VXNlcjIzMjY3OTIz","avatar_url":"https://avatars.githubusercontent.com/u/23267923?v=4","gravatar_id":"","url":"https://api.github.com/users/Makhuta","html_url":"https://github.com/Makhuta","followers_url":"https://api.github.com/users/Makhuta/followers","following_url":"https://api.github.com/users/Makhuta/following{/other_user}","gists_url":"https://api.github.com/users/Makhuta/gists{/gist_id}","starred_url":"https://api.github.com/users/Makhuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Makhuta/subscriptions","organizations_url":"https://api.github.com/users/Makhuta/orgs","repos_url":"https://api.github.com/users/Makhuta/repos","events_url":"https://api.github.com/users/Makhuta/events{/privacy}","received_events_url":"https://api.github.com/users/Makhuta/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"Midou36O","id":45198486,"node_id":"MDQ6VXNlcjQ1MTk4NDg2","avatar_url":"https://avatars.githubusercontent.com/u/45198486?v=4","gravatar_id":"","url":"https://api.github.com/users/Midou36O","html_url":"https://github.com/Midou36O","followers_url":"https://api.github.com/users/Midou36O/followers","following_url":"https://api.github.com/users/Midou36O/following{/other_user}","gists_url":"https://api.github.com/users/Midou36O/gists{/gist_id}","starred_url":"https://api.github.com/users/Midou36O/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Midou36O/subscriptions","organizations_url":"https://api.github.com/users/Midou36O/orgs","repos_url":"https://api.github.com/users/Midou36O/repos","events_url":"https://api.github.com/users/Midou36O/events{/privacy}","received_events_url":"https://api.github.com/users/Midou36O/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"Vladik01-11","id":70571714,"node_id":"MDQ6VXNlcjcwNTcxNzE0","avatar_url":"https://avatars.githubusercontent.com/u/70571714?v=4","gravatar_id":"","url":"https://api.github.com/users/Vladik01-11","html_url":"https://github.com/Vladik01-11","followers_url":"https://api.github.com/users/Vladik01-11/followers","following_url":"https://api.github.com/users/Vladik01-11/following{/other_user}","gists_url":"https://api.github.com/users/Vladik01-11/gists{/gist_id}","starred_url":"https://api.github.com/users/Vladik01-11/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Vladik01-11/subscriptions","organizations_url":"https://api.github.com/users/Vladik01-11/orgs","repos_url":"https://api.github.com/users/Vladik01-11/repos","events_url":"https://api.github.com/users/Vladik01-11/events{/privacy}","received_events_url":"https://api.github.com/users/Vladik01-11/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"yurtpage","id":155876573,"node_id":"U_kgDOCUp83Q","avatar_url":"https://avatars.githubusercontent.com/u/155876573?v=4","gravatar_id":"","url":"https://api.github.com/users/yurtpage","html_url":"https://github.com/yurtpage","followers_url":"https://api.github.com/users/yurtpage/followers","following_url":"https://api.github.com/users/yurtpage/following{/other_user}","gists_url":"https://api.github.com/users/yurtpage/gists{/gist_id}","starred_url":"https://api.github.com/users/yurtpage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yurtpage/subscriptions","organizations_url":"https://api.github.com/users/yurtpage/orgs","repos_url":"https://api.github.com/users/yurtpage/repos","events_url":"https://api.github.com/users/yurtpage/events{/privacy}","received_events_url":"https://api.github.com/users/yurtpage/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"HappyHippo77","id":30226559,"node_id":"MDQ6VXNlcjMwMjI2NTU5","avatar_url":"https://avatars.githubusercontent.com/u/30226559?v=4","gravatar_id":"","url":"https://api.github.com/users/HappyHippo77","html_url":"https://github.com/HappyHippo77","followers_url":"https://api.github.com/users/HappyHippo77/followers","following_url":"https://api.github.com/users/HappyHippo77/following{/other_user}","gists_url":"https://api.github.com/users/HappyHippo77/gists{/gist_id}","starred_url":"https://api.github.com/users/HappyHippo77/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HappyHippo77/subscriptions","organizations_url":"https://api.github.com/users/HappyHippo77/orgs","repos_url":"https://api.github.com/users/HappyHippo77/repos","events_url":"https://api.github.com/users/HappyHippo77/events{/privacy}","received_events_url":"https://api.github.com/users/HappyHippo77/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"IzzySoft","id":6781438,"node_id":"MDQ6VXNlcjY3ODE0Mzg=","avatar_url":"https://avatars.githubusercontent.com/u/6781438?v=4","gravatar_id":"","url":"https://api.github.com/users/IzzySoft","html_url":"https://github.com/IzzySoft","followers_url":"https://api.github.com/users/IzzySoft/followers","following_url":"https://api.github.com/users/IzzySoft/following{/other_user}","gists_url":"https://api.github.com/users/IzzySoft/gists{/gist_id}","starred_url":"https://api.github.com/users/IzzySoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IzzySoft/subscriptions","organizations_url":"https://api.github.com/users/IzzySoft/orgs","repos_url":"https://api.github.com/users/IzzySoft/repos","events_url":"https://api.github.com/users/IzzySoft/events{/privacy}","received_events_url":"https://api.github.com/users/IzzySoft/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"JamsRepos","id":1347620,"node_id":"MDQ6VXNlcjEzNDc2MjA=","avatar_url":"https://avatars.githubusercontent.com/u/1347620?v=4","gravatar_id":"","url":"https://api.github.com/users/JamsRepos","html_url":"https://github.com/JamsRepos","followers_url":"https://api.github.com/users/JamsRepos/followers","following_url":"https://api.github.com/users/JamsRepos/following{/other_user}","gists_url":"https://api.github.com/users/JamsRepos/gists{/gist_id}","starred_url":"https://api.github.com/users/JamsRepos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JamsRepos/subscriptions","organizations_url":"https://api.github.com/users/JamsRepos/orgs","repos_url":"https://api.github.com/users/JamsRepos/repos","events_url":"https://api.github.com/users/JamsRepos/events{/privacy}","received_events_url":"https://api.github.com/users/JamsRepos/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"koelle25","id":915514,"node_id":"MDQ6VXNlcjkxNTUxNA==","avatar_url":"https://avatars.githubusercontent.com/u/915514?v=4","gravatar_id":"","url":"https://api.github.com/users/koelle25","html_url":"https://github.com/koelle25","followers_url":"https://api.github.com/users/koelle25/followers","following_url":"https://api.github.com/users/koelle25/following{/other_user}","gists_url":"https://api.github.com/users/koelle25/gists{/gist_id}","starred_url":"https://api.github.com/users/koelle25/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/koelle25/subscriptions","organizations_url":"https://api.github.com/users/koelle25/orgs","repos_url":"https://api.github.com/users/koelle25/repos","events_url":"https://api.github.com/users/koelle25/events{/privacy}","received_events_url":"https://api.github.com/users/koelle25/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"patrickkempff","id":310766,"node_id":"MDQ6VXNlcjMxMDc2Ng==","avatar_url":"https://avatars.githubusercontent.com/u/310766?v=4","gravatar_id":"","url":"https://api.github.com/users/patrickkempff","html_url":"https://github.com/patrickkempff","followers_url":"https://api.github.com/users/patrickkempff/followers","following_url":"https://api.github.com/users/patrickkempff/following{/other_user}","gists_url":"https://api.github.com/users/patrickkempff/gists{/gist_id}","starred_url":"https://api.github.com/users/patrickkempff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/patrickkempff/subscriptions","organizations_url":"https://api.github.com/users/patrickkempff/orgs","repos_url":"https://api.github.com/users/patrickkempff/repos","events_url":"https://api.github.com/users/patrickkempff/events{/privacy}","received_events_url":"https://api.github.com/users/patrickkempff/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"Spaenny","id":5008508,"node_id":"MDQ6VXNlcjUwMDg1MDg=","avatar_url":"https://avatars.githubusercontent.com/u/5008508?v=4","gravatar_id":"","url":"https://api.github.com/users/Spaenny","html_url":"https://github.com/Spaenny","followers_url":"https://api.github.com/users/Spaenny/followers","following_url":"https://api.github.com/users/Spaenny/following{/other_user}","gists_url":"https://api.github.com/users/Spaenny/gists{/gist_id}","starred_url":"https://api.github.com/users/Spaenny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Spaenny/subscriptions","organizations_url":"https://api.github.com/users/Spaenny/orgs","repos_url":"https://api.github.com/users/Spaenny/repos","events_url":"https://api.github.com/users/Spaenny/events{/privacy}","received_events_url":"https://api.github.com/users/Spaenny/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"Poussinou","id":19646549,"node_id":"MDQ6VXNlcjE5NjQ2NTQ5","avatar_url":"https://avatars.githubusercontent.com/u/19646549?v=4","gravatar_id":"","url":"https://api.github.com/users/Poussinou","html_url":"https://github.com/Poussinou","followers_url":"https://api.github.com/users/Poussinou/followers","following_url":"https://api.github.com/users/Poussinou/following{/other_user}","gists_url":"https://api.github.com/users/Poussinou/gists{/gist_id}","starred_url":"https://api.github.com/users/Poussinou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Poussinou/subscriptions","organizations_url":"https://api.github.com/users/Poussinou/orgs","repos_url":"https://api.github.com/users/Poussinou/repos","events_url":"https://api.github.com/users/Poussinou/events{/privacy}","received_events_url":"https://api.github.com/users/Poussinou/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1}] \ No newline at end of file +[{"login":"WardPearce","id":27844174,"node_id":"MDQ6VXNlcjI3ODQ0MTc0","avatar_url":"https://avatars.githubusercontent.com/u/27844174?v=4","gravatar_id":"","url":"https://api.github.com/users/WardPearce","html_url":"https://github.com/WardPearce","followers_url":"https://api.github.com/users/WardPearce/followers","following_url":"https://api.github.com/users/WardPearce/following{/other_user}","gists_url":"https://api.github.com/users/WardPearce/gists{/gist_id}","starred_url":"https://api.github.com/users/WardPearce/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WardPearce/subscriptions","organizations_url":"https://api.github.com/users/WardPearce/orgs","repos_url":"https://api.github.com/users/WardPearce/repos","events_url":"https://api.github.com/users/WardPearce/events{/privacy}","received_events_url":"https://api.github.com/users/WardPearce/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2312},{"login":"dependabot[bot]","id":49699333,"node_id":"MDM6Qm90NDk2OTkzMzM=","avatar_url":"https://avatars.githubusercontent.com/in/29110?v=4","gravatar_id":"","url":"https://api.github.com/users/dependabot%5Bbot%5D","html_url":"https://github.com/apps/dependabot","followers_url":"https://api.github.com/users/dependabot%5Bbot%5D/followers","following_url":"https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dependabot%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/dependabot%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/dependabot%5Bbot%5D/repos","events_url":"https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/dependabot%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false,"contributions":241},{"login":"Lezurex","id":48829956,"node_id":"MDQ6VXNlcjQ4ODI5OTU2","avatar_url":"https://avatars.githubusercontent.com/u/48829956?v=4","gravatar_id":"","url":"https://api.github.com/users/Lezurex","html_url":"https://github.com/Lezurex","followers_url":"https://api.github.com/users/Lezurex/followers","following_url":"https://api.github.com/users/Lezurex/following{/other_user}","gists_url":"https://api.github.com/users/Lezurex/gists{/gist_id}","starred_url":"https://api.github.com/users/Lezurex/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Lezurex/subscriptions","organizations_url":"https://api.github.com/users/Lezurex/orgs","repos_url":"https://api.github.com/users/Lezurex/repos","events_url":"https://api.github.com/users/Lezurex/events{/privacy}","received_events_url":"https://api.github.com/users/Lezurex/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":44},{"login":"ghostofsparta222","id":251893418,"node_id":"U_kgDODwOWqg","avatar_url":"https://avatars.githubusercontent.com/u/251893418?v=4","gravatar_id":"","url":"https://api.github.com/users/ghostofsparta222","html_url":"https://github.com/ghostofsparta222","followers_url":"https://api.github.com/users/ghostofsparta222/followers","following_url":"https://api.github.com/users/ghostofsparta222/following{/other_user}","gists_url":"https://api.github.com/users/ghostofsparta222/gists{/gist_id}","starred_url":"https://api.github.com/users/ghostofsparta222/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ghostofsparta222/subscriptions","organizations_url":"https://api.github.com/users/ghostofsparta222/orgs","repos_url":"https://api.github.com/users/ghostofsparta222/repos","events_url":"https://api.github.com/users/ghostofsparta222/events{/privacy}","received_events_url":"https://api.github.com/users/ghostofsparta222/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":15},{"login":"Coool","id":8421903,"node_id":"MDQ6VXNlcjg0MjE5MDM=","avatar_url":"https://avatars.githubusercontent.com/u/8421903?v=4","gravatar_id":"","url":"https://api.github.com/users/Coool","html_url":"https://github.com/Coool","followers_url":"https://api.github.com/users/Coool/followers","following_url":"https://api.github.com/users/Coool/following{/other_user}","gists_url":"https://api.github.com/users/Coool/gists{/gist_id}","starred_url":"https://api.github.com/users/Coool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Coool/subscriptions","organizations_url":"https://api.github.com/users/Coool/orgs","repos_url":"https://api.github.com/users/Coool/repos","events_url":"https://api.github.com/users/Coool/events{/privacy}","received_events_url":"https://api.github.com/users/Coool/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":15},{"login":"araujosemacento","id":60983392,"node_id":"MDQ6VXNlcjYwOTgzMzky","avatar_url":"https://avatars.githubusercontent.com/u/60983392?v=4","gravatar_id":"","url":"https://api.github.com/users/araujosemacento","html_url":"https://github.com/araujosemacento","followers_url":"https://api.github.com/users/araujosemacento/followers","following_url":"https://api.github.com/users/araujosemacento/following{/other_user}","gists_url":"https://api.github.com/users/araujosemacento/gists{/gist_id}","starred_url":"https://api.github.com/users/araujosemacento/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/araujosemacento/subscriptions","organizations_url":"https://api.github.com/users/araujosemacento/orgs","repos_url":"https://api.github.com/users/araujosemacento/repos","events_url":"https://api.github.com/users/araujosemacento/events{/privacy}","received_events_url":"https://api.github.com/users/araujosemacento/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":14},{"login":"toolatebot","id":169580663,"node_id":"U_kgDOChuYdw","avatar_url":"https://avatars.githubusercontent.com/u/169580663?v=4","gravatar_id":"","url":"https://api.github.com/users/toolatebot","html_url":"https://github.com/toolatebot","followers_url":"https://api.github.com/users/toolatebot/followers","following_url":"https://api.github.com/users/toolatebot/following{/other_user}","gists_url":"https://api.github.com/users/toolatebot/gists{/gist_id}","starred_url":"https://api.github.com/users/toolatebot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/toolatebot/subscriptions","organizations_url":"https://api.github.com/users/toolatebot/orgs","repos_url":"https://api.github.com/users/toolatebot/repos","events_url":"https://api.github.com/users/toolatebot/events{/privacy}","received_events_url":"https://api.github.com/users/toolatebot/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":9},{"login":"Precific","id":30053082,"node_id":"MDQ6VXNlcjMwMDUzMDgy","avatar_url":"https://avatars.githubusercontent.com/u/30053082?v=4","gravatar_id":"","url":"https://api.github.com/users/Precific","html_url":"https://github.com/Precific","followers_url":"https://api.github.com/users/Precific/followers","following_url":"https://api.github.com/users/Precific/following{/other_user}","gists_url":"https://api.github.com/users/Precific/gists{/gist_id}","starred_url":"https://api.github.com/users/Precific/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Precific/subscriptions","organizations_url":"https://api.github.com/users/Precific/orgs","repos_url":"https://api.github.com/users/Precific/repos","events_url":"https://api.github.com/users/Precific/events{/privacy}","received_events_url":"https://api.github.com/users/Precific/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":9},{"login":"yzqzss","id":30341059,"node_id":"MDQ6VXNlcjMwMzQxMDU5","avatar_url":"https://avatars.githubusercontent.com/u/30341059?v=4","gravatar_id":"","url":"https://api.github.com/users/yzqzss","html_url":"https://github.com/yzqzss","followers_url":"https://api.github.com/users/yzqzss/followers","following_url":"https://api.github.com/users/yzqzss/following{/other_user}","gists_url":"https://api.github.com/users/yzqzss/gists{/gist_id}","starred_url":"https://api.github.com/users/yzqzss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yzqzss/subscriptions","organizations_url":"https://api.github.com/users/yzqzss/orgs","repos_url":"https://api.github.com/users/yzqzss/repos","events_url":"https://api.github.com/users/yzqzss/events{/privacy}","received_events_url":"https://api.github.com/users/yzqzss/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"thejenja","id":65224669,"node_id":"MDQ6VXNlcjY1MjI0NjY5","avatar_url":"https://avatars.githubusercontent.com/u/65224669?v=4","gravatar_id":"","url":"https://api.github.com/users/thejenja","html_url":"https://github.com/thejenja","followers_url":"https://api.github.com/users/thejenja/followers","following_url":"https://api.github.com/users/thejenja/following{/other_user}","gists_url":"https://api.github.com/users/thejenja/gists{/gist_id}","starred_url":"https://api.github.com/users/thejenja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thejenja/subscriptions","organizations_url":"https://api.github.com/users/thejenja/orgs","repos_url":"https://api.github.com/users/thejenja/repos","events_url":"https://api.github.com/users/thejenja/events{/privacy}","received_events_url":"https://api.github.com/users/thejenja/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"cookiennn","id":114363954,"node_id":"U_kgDOBtEOMg","avatar_url":"https://avatars.githubusercontent.com/u/114363954?v=4","gravatar_id":"","url":"https://api.github.com/users/cookiennn","html_url":"https://github.com/cookiennn","followers_url":"https://api.github.com/users/cookiennn/followers","following_url":"https://api.github.com/users/cookiennn/following{/other_user}","gists_url":"https://api.github.com/users/cookiennn/gists{/gist_id}","starred_url":"https://api.github.com/users/cookiennn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cookiennn/subscriptions","organizations_url":"https://api.github.com/users/cookiennn/orgs","repos_url":"https://api.github.com/users/cookiennn/repos","events_url":"https://api.github.com/users/cookiennn/events{/privacy}","received_events_url":"https://api.github.com/users/cookiennn/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"SecularSteve","id":33793273,"node_id":"MDQ6VXNlcjMzNzkzMjcz","avatar_url":"https://avatars.githubusercontent.com/u/33793273?v=4","gravatar_id":"","url":"https://api.github.com/users/SecularSteve","html_url":"https://github.com/SecularSteve","followers_url":"https://api.github.com/users/SecularSteve/followers","following_url":"https://api.github.com/users/SecularSteve/following{/other_user}","gists_url":"https://api.github.com/users/SecularSteve/gists{/gist_id}","starred_url":"https://api.github.com/users/SecularSteve/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SecularSteve/subscriptions","organizations_url":"https://api.github.com/users/SecularSteve/orgs","repos_url":"https://api.github.com/users/SecularSteve/repos","events_url":"https://api.github.com/users/SecularSteve/events{/privacy}","received_events_url":"https://api.github.com/users/SecularSteve/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"R0GGER","id":8298741,"node_id":"MDQ6VXNlcjgyOTg3NDE=","avatar_url":"https://avatars.githubusercontent.com/u/8298741?v=4","gravatar_id":"","url":"https://api.github.com/users/R0GGER","html_url":"https://github.com/R0GGER","followers_url":"https://api.github.com/users/R0GGER/followers","following_url":"https://api.github.com/users/R0GGER/following{/other_user}","gists_url":"https://api.github.com/users/R0GGER/gists{/gist_id}","starred_url":"https://api.github.com/users/R0GGER/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/R0GGER/subscriptions","organizations_url":"https://api.github.com/users/R0GGER/orgs","repos_url":"https://api.github.com/users/R0GGER/repos","events_url":"https://api.github.com/users/R0GGER/events{/privacy}","received_events_url":"https://api.github.com/users/R0GGER/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"arcoast","id":81871508,"node_id":"MDQ6VXNlcjgxODcxNTA4","avatar_url":"https://avatars.githubusercontent.com/u/81871508?v=4","gravatar_id":"","url":"https://api.github.com/users/arcoast","html_url":"https://github.com/arcoast","followers_url":"https://api.github.com/users/arcoast/followers","following_url":"https://api.github.com/users/arcoast/following{/other_user}","gists_url":"https://api.github.com/users/arcoast/gists{/gist_id}","starred_url":"https://api.github.com/users/arcoast/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arcoast/subscriptions","organizations_url":"https://api.github.com/users/arcoast/orgs","repos_url":"https://api.github.com/users/arcoast/repos","events_url":"https://api.github.com/users/arcoast/events{/privacy}","received_events_url":"https://api.github.com/users/arcoast/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"coolvitto","id":160416811,"node_id":"U_kgDOCY_EKw","avatar_url":"https://avatars.githubusercontent.com/u/160416811?v=4","gravatar_id":"","url":"https://api.github.com/users/coolvitto","html_url":"https://github.com/coolvitto","followers_url":"https://api.github.com/users/coolvitto/followers","following_url":"https://api.github.com/users/coolvitto/following{/other_user}","gists_url":"https://api.github.com/users/coolvitto/gists{/gist_id}","starred_url":"https://api.github.com/users/coolvitto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/coolvitto/subscriptions","organizations_url":"https://api.github.com/users/coolvitto/orgs","repos_url":"https://api.github.com/users/coolvitto/repos","events_url":"https://api.github.com/users/coolvitto/events{/privacy}","received_events_url":"https://api.github.com/users/coolvitto/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"maboroshin","id":41102508,"node_id":"MDQ6VXNlcjQxMTAyNTA4","avatar_url":"https://avatars.githubusercontent.com/u/41102508?v=4","gravatar_id":"","url":"https://api.github.com/users/maboroshin","html_url":"https://github.com/maboroshin","followers_url":"https://api.github.com/users/maboroshin/followers","following_url":"https://api.github.com/users/maboroshin/following{/other_user}","gists_url":"https://api.github.com/users/maboroshin/gists{/gist_id}","starred_url":"https://api.github.com/users/maboroshin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maboroshin/subscriptions","organizations_url":"https://api.github.com/users/maboroshin/orgs","repos_url":"https://api.github.com/users/maboroshin/repos","events_url":"https://api.github.com/users/maboroshin/events{/privacy}","received_events_url":"https://api.github.com/users/maboroshin/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"pinembour","id":15938873,"node_id":"MDQ6VXNlcjE1OTM4ODcz","avatar_url":"https://avatars.githubusercontent.com/u/15938873?v=4","gravatar_id":"","url":"https://api.github.com/users/pinembour","html_url":"https://github.com/pinembour","followers_url":"https://api.github.com/users/pinembour/followers","following_url":"https://api.github.com/users/pinembour/following{/other_user}","gists_url":"https://api.github.com/users/pinembour/gists{/gist_id}","starred_url":"https://api.github.com/users/pinembour/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pinembour/subscriptions","organizations_url":"https://api.github.com/users/pinembour/orgs","repos_url":"https://api.github.com/users/pinembour/repos","events_url":"https://api.github.com/users/pinembour/events{/privacy}","received_events_url":"https://api.github.com/users/pinembour/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"lamarios","id":1192563,"node_id":"MDQ6VXNlcjExOTI1NjM=","avatar_url":"https://avatars.githubusercontent.com/u/1192563?v=4","gravatar_id":"","url":"https://api.github.com/users/lamarios","html_url":"https://github.com/lamarios","followers_url":"https://api.github.com/users/lamarios/followers","following_url":"https://api.github.com/users/lamarios/following{/other_user}","gists_url":"https://api.github.com/users/lamarios/gists{/gist_id}","starred_url":"https://api.github.com/users/lamarios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lamarios/subscriptions","organizations_url":"https://api.github.com/users/lamarios/orgs","repos_url":"https://api.github.com/users/lamarios/repos","events_url":"https://api.github.com/users/lamarios/events{/privacy}","received_events_url":"https://api.github.com/users/lamarios/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"bonswouar","id":615053,"node_id":"MDQ6VXNlcjYxNTA1Mw==","avatar_url":"https://avatars.githubusercontent.com/u/615053?v=4","gravatar_id":"","url":"https://api.github.com/users/bonswouar","html_url":"https://github.com/bonswouar","followers_url":"https://api.github.com/users/bonswouar/followers","following_url":"https://api.github.com/users/bonswouar/following{/other_user}","gists_url":"https://api.github.com/users/bonswouar/gists{/gist_id}","starred_url":"https://api.github.com/users/bonswouar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bonswouar/subscriptions","organizations_url":"https://api.github.com/users/bonswouar/orgs","repos_url":"https://api.github.com/users/bonswouar/repos","events_url":"https://api.github.com/users/bonswouar/events{/privacy}","received_events_url":"https://api.github.com/users/bonswouar/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"Makhuta","id":23267923,"node_id":"MDQ6VXNlcjIzMjY3OTIz","avatar_url":"https://avatars.githubusercontent.com/u/23267923?v=4","gravatar_id":"","url":"https://api.github.com/users/Makhuta","html_url":"https://github.com/Makhuta","followers_url":"https://api.github.com/users/Makhuta/followers","following_url":"https://api.github.com/users/Makhuta/following{/other_user}","gists_url":"https://api.github.com/users/Makhuta/gists{/gist_id}","starred_url":"https://api.github.com/users/Makhuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Makhuta/subscriptions","organizations_url":"https://api.github.com/users/Makhuta/orgs","repos_url":"https://api.github.com/users/Makhuta/repos","events_url":"https://api.github.com/users/Makhuta/events{/privacy}","received_events_url":"https://api.github.com/users/Makhuta/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"Midou36O","id":45198486,"node_id":"MDQ6VXNlcjQ1MTk4NDg2","avatar_url":"https://avatars.githubusercontent.com/u/45198486?v=4","gravatar_id":"","url":"https://api.github.com/users/Midou36O","html_url":"https://github.com/Midou36O","followers_url":"https://api.github.com/users/Midou36O/followers","following_url":"https://api.github.com/users/Midou36O/following{/other_user}","gists_url":"https://api.github.com/users/Midou36O/gists{/gist_id}","starred_url":"https://api.github.com/users/Midou36O/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Midou36O/subscriptions","organizations_url":"https://api.github.com/users/Midou36O/orgs","repos_url":"https://api.github.com/users/Midou36O/repos","events_url":"https://api.github.com/users/Midou36O/events{/privacy}","received_events_url":"https://api.github.com/users/Midou36O/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"Vladik01-11","id":70571714,"node_id":"MDQ6VXNlcjcwNTcxNzE0","avatar_url":"https://avatars.githubusercontent.com/u/70571714?v=4","gravatar_id":"","url":"https://api.github.com/users/Vladik01-11","html_url":"https://github.com/Vladik01-11","followers_url":"https://api.github.com/users/Vladik01-11/followers","following_url":"https://api.github.com/users/Vladik01-11/following{/other_user}","gists_url":"https://api.github.com/users/Vladik01-11/gists{/gist_id}","starred_url":"https://api.github.com/users/Vladik01-11/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Vladik01-11/subscriptions","organizations_url":"https://api.github.com/users/Vladik01-11/orgs","repos_url":"https://api.github.com/users/Vladik01-11/repos","events_url":"https://api.github.com/users/Vladik01-11/events{/privacy}","received_events_url":"https://api.github.com/users/Vladik01-11/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"yurtpage","id":155876573,"node_id":"U_kgDOCUp83Q","avatar_url":"https://avatars.githubusercontent.com/u/155876573?v=4","gravatar_id":"","url":"https://api.github.com/users/yurtpage","html_url":"https://github.com/yurtpage","followers_url":"https://api.github.com/users/yurtpage/followers","following_url":"https://api.github.com/users/yurtpage/following{/other_user}","gists_url":"https://api.github.com/users/yurtpage/gists{/gist_id}","starred_url":"https://api.github.com/users/yurtpage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yurtpage/subscriptions","organizations_url":"https://api.github.com/users/yurtpage/orgs","repos_url":"https://api.github.com/users/yurtpage/repos","events_url":"https://api.github.com/users/yurtpage/events{/privacy}","received_events_url":"https://api.github.com/users/yurtpage/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"HappyHippo77","id":30226559,"node_id":"MDQ6VXNlcjMwMjI2NTU5","avatar_url":"https://avatars.githubusercontent.com/u/30226559?v=4","gravatar_id":"","url":"https://api.github.com/users/HappyHippo77","html_url":"https://github.com/HappyHippo77","followers_url":"https://api.github.com/users/HappyHippo77/followers","following_url":"https://api.github.com/users/HappyHippo77/following{/other_user}","gists_url":"https://api.github.com/users/HappyHippo77/gists{/gist_id}","starred_url":"https://api.github.com/users/HappyHippo77/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HappyHippo77/subscriptions","organizations_url":"https://api.github.com/users/HappyHippo77/orgs","repos_url":"https://api.github.com/users/HappyHippo77/repos","events_url":"https://api.github.com/users/HappyHippo77/events{/privacy}","received_events_url":"https://api.github.com/users/HappyHippo77/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"IzzySoft","id":6781438,"node_id":"MDQ6VXNlcjY3ODE0Mzg=","avatar_url":"https://avatars.githubusercontent.com/u/6781438?v=4","gravatar_id":"","url":"https://api.github.com/users/IzzySoft","html_url":"https://github.com/IzzySoft","followers_url":"https://api.github.com/users/IzzySoft/followers","following_url":"https://api.github.com/users/IzzySoft/following{/other_user}","gists_url":"https://api.github.com/users/IzzySoft/gists{/gist_id}","starred_url":"https://api.github.com/users/IzzySoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IzzySoft/subscriptions","organizations_url":"https://api.github.com/users/IzzySoft/orgs","repos_url":"https://api.github.com/users/IzzySoft/repos","events_url":"https://api.github.com/users/IzzySoft/events{/privacy}","received_events_url":"https://api.github.com/users/IzzySoft/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"JamsRepos","id":1347620,"node_id":"MDQ6VXNlcjEzNDc2MjA=","avatar_url":"https://avatars.githubusercontent.com/u/1347620?v=4","gravatar_id":"","url":"https://api.github.com/users/JamsRepos","html_url":"https://github.com/JamsRepos","followers_url":"https://api.github.com/users/JamsRepos/followers","following_url":"https://api.github.com/users/JamsRepos/following{/other_user}","gists_url":"https://api.github.com/users/JamsRepos/gists{/gist_id}","starred_url":"https://api.github.com/users/JamsRepos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JamsRepos/subscriptions","organizations_url":"https://api.github.com/users/JamsRepos/orgs","repos_url":"https://api.github.com/users/JamsRepos/repos","events_url":"https://api.github.com/users/JamsRepos/events{/privacy}","received_events_url":"https://api.github.com/users/JamsRepos/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"koelle25","id":915514,"node_id":"MDQ6VXNlcjkxNTUxNA==","avatar_url":"https://avatars.githubusercontent.com/u/915514?v=4","gravatar_id":"","url":"https://api.github.com/users/koelle25","html_url":"https://github.com/koelle25","followers_url":"https://api.github.com/users/koelle25/followers","following_url":"https://api.github.com/users/koelle25/following{/other_user}","gists_url":"https://api.github.com/users/koelle25/gists{/gist_id}","starred_url":"https://api.github.com/users/koelle25/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/koelle25/subscriptions","organizations_url":"https://api.github.com/users/koelle25/orgs","repos_url":"https://api.github.com/users/koelle25/repos","events_url":"https://api.github.com/users/koelle25/events{/privacy}","received_events_url":"https://api.github.com/users/koelle25/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"patrickkempff","id":310766,"node_id":"MDQ6VXNlcjMxMDc2Ng==","avatar_url":"https://avatars.githubusercontent.com/u/310766?v=4","gravatar_id":"","url":"https://api.github.com/users/patrickkempff","html_url":"https://github.com/patrickkempff","followers_url":"https://api.github.com/users/patrickkempff/followers","following_url":"https://api.github.com/users/patrickkempff/following{/other_user}","gists_url":"https://api.github.com/users/patrickkempff/gists{/gist_id}","starred_url":"https://api.github.com/users/patrickkempff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/patrickkempff/subscriptions","organizations_url":"https://api.github.com/users/patrickkempff/orgs","repos_url":"https://api.github.com/users/patrickkempff/repos","events_url":"https://api.github.com/users/patrickkempff/events{/privacy}","received_events_url":"https://api.github.com/users/patrickkempff/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"Spaenny","id":5008508,"node_id":"MDQ6VXNlcjUwMDg1MDg=","avatar_url":"https://avatars.githubusercontent.com/u/5008508?v=4","gravatar_id":"","url":"https://api.github.com/users/Spaenny","html_url":"https://github.com/Spaenny","followers_url":"https://api.github.com/users/Spaenny/followers","following_url":"https://api.github.com/users/Spaenny/following{/other_user}","gists_url":"https://api.github.com/users/Spaenny/gists{/gist_id}","starred_url":"https://api.github.com/users/Spaenny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Spaenny/subscriptions","organizations_url":"https://api.github.com/users/Spaenny/orgs","repos_url":"https://api.github.com/users/Spaenny/repos","events_url":"https://api.github.com/users/Spaenny/events{/privacy}","received_events_url":"https://api.github.com/users/Spaenny/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1},{"login":"Poussinou","id":19646549,"node_id":"MDQ6VXNlcjE5NjQ2NTQ5","avatar_url":"https://avatars.githubusercontent.com/u/19646549?v=4","gravatar_id":"","url":"https://api.github.com/users/Poussinou","html_url":"https://github.com/Poussinou","followers_url":"https://api.github.com/users/Poussinou/followers","following_url":"https://api.github.com/users/Poussinou/following{/other_user}","gists_url":"https://api.github.com/users/Poussinou/gists{/gist_id}","starred_url":"https://api.github.com/users/Poussinou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Poussinou/subscriptions","organizations_url":"https://api.github.com/users/Poussinou/orgs","repos_url":"https://api.github.com/users/Poussinou/repos","events_url":"https://api.github.com/users/Poussinou/events{/privacy}","received_events_url":"https://api.github.com/users/Poussinou/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1}] \ No newline at end of file From e9cee8d00bc8f78a7700803ab02be6cd7c051bba Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sat, 7 Mar 2026 23:25:07 +1300 Subject: [PATCH 3/8] Improved our conditional filter --- .../lib/components/settings/Filters.svelte | 164 +++++++++++------- materialious/src/lib/filtering/index.ts | 83 ++++----- materialious/src/lib/filtering/schemas.ts | 6 +- 3 files changed, 154 insertions(+), 99 deletions(-) diff --git a/materialious/src/lib/components/settings/Filters.svelte b/materialious/src/lib/components/settings/Filters.svelte index fbca8d31..8ae738d0 100644 --- a/materialious/src/lib/components/settings/Filters.svelte +++ b/materialious/src/lib/components/settings/Filters.svelte @@ -52,7 +52,7 @@ function filtersAsJSON() { return JSON.stringify( { - version: 'v1', + version: 'v2', createdFor: 'materialious', filterBy: contentFilters }, @@ -98,6 +98,14 @@

{$_('layout.backendEngine.warning')}

+

+ Need Help? Check out our guide. +

@@ -179,9 +187,9 @@
{#if filter.conditions}
    - {#each filter.conditions as condition (condition)} + {#each filter.conditions as condition, conditionIndex (condition)}
  • - + + {#if condition.values.length > 0 && index < condition.values.length - 1} +
    OR
    + {/if} + {/each} + +
    +
  • + + {#if filter.conditions.length > 0 && conditionIndex < filter.conditions.length - 1} +
    AND
    + {/if} {/each}
{/if} @@ -303,8 +348,9 @@ filter.conditions.push({ operator: 'equals', field: 'author', - value: '' + values: [''] }); + filterContentListStore.set(contentFilters); filterContentUrlAutoUpdateStore.set(false); }} class="surface-container-highest" diff --git a/materialious/src/lib/filtering/index.ts b/materialious/src/lib/filtering/index.ts index 78afade9..eadec3f9 100644 --- a/materialious/src/lib/filtering/index.ts +++ b/materialious/src/lib/filtering/index.ts @@ -23,14 +23,17 @@ const zFilterCondition = z.object({ message: 'Invalid field' }), // Field to filter operator: zFilterOperatorEnum, // Operator - value: z.union([ - // Value to compare against - z.string(), - z.number(), - z.array(z.string()), - z.array(z.number()), - z.string().regex(/.*/) - ]) + values: z.array( + z.union([ + // Value to compare against + z.string(), + z.number(), + z.array(z.string()), + z.array(z.number()), + z.string().regex(/.*/) + ]) + ), + note: z.string().optional() }); // Logical grouping operator @@ -42,7 +45,7 @@ export const zFilterGroup = z.object({ export const zFilterSchema = z.array(zFilterGroup); const zFilterRootSchema = z.object({ - version: z.literal('v1'), + version: z.literal('v2'), createdFor: z.literal('materialious'), filterBy: zFilterSchema }); @@ -66,45 +69,47 @@ export function isItemFiltered(item: FeedItem): boolean { const fieldValue = item[condition.field as keyof FeedItem]; - switch (condition.operator) { - case 'equals': - return fieldValue.toString() === condition.value.toString(); + return condition.values.some((conditionValue) => { + switch (condition.operator) { + case 'equals': + return fieldValue.toString() === conditionValue.toString(); - case 'in': - return Array.isArray(condition.value) && (condition.value as any[]).includes(fieldValue); + case 'in': + return Array.isArray(conditionValue) && (conditionValue as any[]).includes(fieldValue); - case 'like': - return ( - typeof fieldValue === 'string' && - typeof condition.value === 'string' && - fieldValue.toLowerCase().includes(condition.value.toLowerCase()) - ); + case 'like': + return ( + typeof fieldValue === 'string' && + typeof conditionValue === 'string' && + fieldValue.toLowerCase().includes(conditionValue.toLowerCase()) + ); - case 'gt': - return ( - typeof fieldValue === 'number' && - typeof condition.value === 'number' && - fieldValue > condition.value - ); + case 'gt': + return ( + typeof fieldValue === 'number' && + typeof conditionValue === 'number' && + fieldValue > conditionValue + ); - case 'lt': - return ( - typeof fieldValue === 'number' && - typeof condition.value === 'number' && - fieldValue < condition.value - ); + case 'lt': + return ( + typeof fieldValue === 'number' && + typeof conditionValue === 'number' && + fieldValue < conditionValue + ); - case 'regex': - if (typeof condition.value !== 'string' || !isSafeRegex(condition.value)) return false; + case 'regex': + if (typeof conditionValue !== 'string' || !isSafeRegex(conditionValue)) return false; - return typeof fieldValue === 'string' && new RegExp(condition.value).test(fieldValue); + return typeof fieldValue === 'string' && new RegExp(conditionValue).test(fieldValue); - default: - return false; - } + default: + return false; + } + }); }; - return filterGroup.conditions.every(evaluateCondition); + return filterGroup.conditions.some(evaluateCondition); }); } diff --git a/materialious/src/lib/filtering/schemas.ts b/materialious/src/lib/filtering/schemas.ts index a4915eff..c0d506b6 100644 --- a/materialious/src/lib/filtering/schemas.ts +++ b/materialious/src/lib/filtering/schemas.ts @@ -13,7 +13,11 @@ export const VideoSchema: SchemaStructure = { type: ['video', 'shortVideo', 'stream'], videoId: 'string', viewCount: 'number', - viewCountText: 'string' + viewCountText: 'string', + lengthSeconds: 'number', + premiereTimestamp: 'number', + isUpcoming: 'boolean', + premium: 'boolean' }; export const ChannelSchema: SchemaStructure = { From a56adccef241af07fd0c711f0883100d7a684b13 Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sat, 7 Mar 2026 23:25:11 +1300 Subject: [PATCH 4/8] Create CONTENT-FILTERS.md --- docs/CONTENT-FILTERS.md | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 docs/CONTENT-FILTERS.md diff --git a/docs/CONTENT-FILTERS.md b/docs/CONTENT-FILTERS.md new file mode 100644 index 00000000..d6fc126e --- /dev/null +++ b/docs/CONTENT-FILTERS.md @@ -0,0 +1,64 @@ +# What is Content filters? +Content filters allows you to conditionally filter content on Materialious based off attributes belonging to Channels & Videos. This allows you to hide content you find offensive, dislike or want to avoid. + +# What is "Import Filters from URL" +Materialious allows you to import content filters from other sites, this can be powerful tool as you can write scripts what follows Materialious schema allowing you to generate massive content filters. + +Enabling "Automatically update filter from URL" will mean Materialious automatically pulls any changes to the filter list from the provided URL. + +# Understanding content filters + +## Filter/Content type +Each filter represents a content type ("Video" or "Channel".) This content type dictates what attributes are available like author id, video id etc... + +Each content type has one or more conditionals. These conditionals define what attributes must equal in order to filter a piece of content. + +## Conditionals +### Field +This represents the attribute of the content type. + +### Operators +- `equals` - Value must match exactly. +- `in` - Value is in an array. +- `like` - Value is in the string, e.g. "XYZ" is in "Channel XYZ". +- `gt` - Greater then value. +- `lt` - Less then value. +- `regex` - Define regex expression. + +#### Value +Each conditional can have multiple values, each value acts as an "OR" operator. So if one value matches then the piece of content is filtered. + +# Writing our schema with JSON (Advanced) +```json +{ + "version": "v2", // Must be present + "createdFor": "materialious", // Must be present + "filterBy": [ // Conditionals to filter by + { + "conditions": [ + { + "operator": "equals", // Exact match + "field": "authorId", // authorId attribute from video content type + "values": [ + "UCH-_hzb2ILSCo9ftVSnrCIQ", // Filter this video ID + "UCLqH-U2TXzj1h7lyYQZLNQQ" // or this video ID. + ] + } + ], + "type": "video" // The content type + }, + { + "conditions": [ + { + "operator": "equals", + "field": "authorId", + "values": [ + "UCH-_hzb2ILSCo9ftVSnrCIQ" + ] + } + ], + "type": "channel" + } + ] +} +``` From 9c1767e6d720cd820db167d13a2d43cc3b9f12e2 Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sat, 7 Mar 2026 23:29:50 +1300 Subject: [PATCH 5/8] Fixed feed thumbnails not cropping --- .../lib/components/thumbnail/VideoThumbnail.svelte | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte b/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte index d433d59a..f3996605 100644 --- a/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte +++ b/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte @@ -69,7 +69,15 @@ } } - const thumbnail = new Avatar({ src: () => thumbnailSrc }); + let thumbnailHeight = $state(0); + + const thumbnail = new Avatar({ + src: () => thumbnailSrc, + onLoadingStatusChange: () => { + if (thumbnailHTMLElement) thumbnailHeight = thumbnailHTMLElement.naturalHeight; + } + }); + let thumbnailHTMLElement: HTMLImageElement | undefined = $state(); let startedSideways = sideways === true; @@ -113,7 +121,7 @@ onclick={onVideoSelected} >
-
300 : false}> +
300}> Date: Sat, 7 Mar 2026 23:59:03 +1300 Subject: [PATCH 6/8] Implemented channel avatars on feed --- materialious/src/lib/api/invidious/channel.ts | 9 +- materialious/src/lib/api/invidious/video.ts | 10 ++- materialious/src/lib/api/youtubejs/channel.ts | 2 + materialious/src/lib/api/youtubejs/video.ts | 3 + .../thumbnail/VideoThumbnail.svelte | 83 ++++++++++++------- materialious/src/lib/dexie.ts | 12 ++- materialious/src/lib/thumbnail.ts | 27 ++++++ 7 files changed, 112 insertions(+), 34 deletions(-) create mode 100644 materialious/src/lib/thumbnail.ts diff --git a/materialious/src/lib/api/invidious/channel.ts b/materialious/src/lib/api/invidious/channel.ts index 98212cb3..a49e4e84 100644 --- a/materialious/src/lib/api/invidious/channel.ts +++ b/materialious/src/lib/api/invidious/channel.ts @@ -1,3 +1,4 @@ +import { associateAvatar } from '$lib/thumbnail'; import type { ChannelContent, ChannelOptions, ChannelPage } from '../model'; import { buildPath, fetchErrorHandle } from './request'; @@ -8,7 +9,13 @@ export async function getChannelInvidious( const resp = await fetchErrorHandle( await fetch(buildPath(`channels/${channelId}`), fetchOptions) ); - return await resp.json(); + const respJson = await resp.json(); + + if (resp.ok) { + associateAvatar(channelId, respJson.authorBanners); + } + + return respJson; } export async function getChannelContentInvidious( diff --git a/materialious/src/lib/api/invidious/video.ts b/materialious/src/lib/api/invidious/video.ts index 0bd15d5b..bfd3fd23 100644 --- a/materialious/src/lib/api/invidious/video.ts +++ b/materialious/src/lib/api/invidious/video.ts @@ -4,6 +4,7 @@ import { buildPath, fetchErrorHandle } from './request'; import { getVideoYTjs } from '../youtubejs/video'; import { playerYouTubeJsFallback } from '$lib/store'; import { isUnrestrictedPlatform } from '$lib/misc'; +import { associateAvatar } from '$lib/thumbnail'; export async function getVideoInvidious( videoId: string, @@ -20,5 +21,12 @@ export async function getVideoInvidious( } else { await fetchErrorHandle(resp); } - return await resp.json(); + + const respJson = await resp.json(); + + if (resp.ok) { + associateAvatar(respJson.authorId, respJson.authorThumbnails); + } + + return respJson; } diff --git a/materialious/src/lib/api/youtubejs/channel.ts b/materialious/src/lib/api/youtubejs/channel.ts index fd77bc6a..82240788 100644 --- a/materialious/src/lib/api/youtubejs/channel.ts +++ b/materialious/src/lib/api/youtubejs/channel.ts @@ -9,6 +9,7 @@ import type { Video } from '../model'; import { invidiousItemSchema } from './schema'; +import { associateAvatar } from '$lib/thumbnail'; export async function getChannelYTjs(channelId: string): Promise { const innertube = await getInnertube(); @@ -23,6 +24,7 @@ export async function getChannelYTjs(channelId: string): Promise { innerResults.header.content?.is(YTNodes.PageHeaderView) ) { authorBanners = innerResults.header.content.banner?.image ?? []; + associateAvatar(channelId, authorBanners); } const description = innerResults.metadata.description ?? ''; diff --git a/materialious/src/lib/api/youtubejs/video.ts b/materialious/src/lib/api/youtubejs/video.ts index f9d89d3e..1c245cf1 100644 --- a/materialious/src/lib/api/youtubejs/video.ts +++ b/materialious/src/lib/api/youtubejs/video.ts @@ -17,6 +17,7 @@ import { Utils, YT, YTNodes, Platform, type IGetChallengeResponse } from 'youtub import { getInnertube } from '.'; import { isUnrestrictedPlatform } from '$lib/misc'; import { webPoTokenMinter } from '$lib/web/youtube/minter'; +import { associateAvatar } from '$lib/thumbnail'; Platform.shim.eval = async ( data: Types.BuildScriptResult, @@ -149,6 +150,8 @@ export async function getVideoYTjs(videoId: string): Promise { if (video.basic_info.channel_id) { const channel = await innertube.getChannel(video.basic_info.channel_id); authorThumbnails = channel.metadata.avatar as Image[]; + + associateAvatar(video.basic_info.channel_id, authorThumbnails); } else { authorThumbnails = []; } diff --git a/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte b/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte index f3996605..d00a75a1 100644 --- a/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte +++ b/materialious/src/lib/components/thumbnail/VideoThumbnail.svelte @@ -19,6 +19,8 @@ import { queueGetWatchHistory } from '$lib/api/historyPool'; import { page } from '$app/state'; import { getDeArrow, getThumbnailDeArrow } from '$lib/api/dearrow'; + import { avatarFromChannelId } from '$lib/thumbnail'; + import { mergeAttrs } from 'melt'; interface Props { video: VideoBase | Video | Notification | PlaylistPageVideo | VideoWatchHistory; @@ -70,6 +72,7 @@ } let thumbnailHeight = $state(0); + let thumbnailHTMLElement: HTMLImageElement | undefined = $state(); const thumbnail = new Avatar({ src: () => thumbnailSrc, @@ -78,7 +81,10 @@ } }); - let thumbnailHTMLElement: HTMLImageElement | undefined = $state(); + let authorAvatarSrc = $state(''); + const authorAvatar = new Avatar({ + src: () => authorAvatarSrc + }); let startedSideways = sideways === true; function disableSideways() { @@ -90,6 +96,12 @@ } onMount(async () => { + if ('authorId' in video) { + avatarFromChannelId(video.authorId).then((url) => { + if (url) authorAvatarSrc = url; + }); + } + // Check if sideways should be enabled or disabled. disableSideways(); @@ -181,39 +193,50 @@ {letterCase(video.title.trimEnd())} -
- {#if 'authorId' in video && video.authorId} - {video.author} - - {:else} -

{video.author}

+
+
diff --git a/materialious/src/lib/dexie.ts b/materialious/src/lib/dexie.ts index 982d4714..80851826 100644 --- a/materialious/src/lib/dexie.ts +++ b/materialious/src/lib/dexie.ts @@ -13,19 +13,27 @@ export interface ChannelSubscriptions { lastRSSFetch: Date; } +export interface ChannelAvatars { + channelId: string; + avatarUrl: string; + updated: Date; +} + export class MaterialiousDb extends Dexie { favouriteChannels!: Table; channelSubscriptions!: Table; subscriptionFeed!: Table