Merge pull request #1654 from Materialious/update/1.16.26

Update/1.16.26
This commit is contained in:
Ward
2026-04-30 03:32:59 +12:00
committed by GitHub
24 changed files with 204 additions and 133 deletions
+3
View File
@@ -69,6 +69,9 @@ services:
# Should be comma separated and be the base domain
# e.g. "youtube.com,google.com" NOT "https://youtube.com,https://videos.google.com"
WHITELIST_BASE_DOMAIN: ""
# Specify a path to a certificate to trust, useful when using self-signed certificates.
PROXY_TRUST_CA: ""
# Allow any domain in proxy
# This shouldn't be used unless you KNOW what your doing
@@ -1 +1 @@
Invidious klients ar modernu Material dizainu
YouTube un Invidious klients ar modernu Material dizainu.
+2 -2
View File
@@ -4,10 +4,10 @@
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-03-02T08:05:49.685303023Z">
<DropdownSelection timestamp="2026-04-29T14:52:49.139078433Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=/home/wpearce/.android/avd/Television_4K.avd" />
<DeviceId pluginId="LocalEmulator" identifier="path=/home/wpearce/.android/avd/Pixel_9.avd" />
</handle>
</Target>
</DropdownSelection>
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 242
versionName "1.16.25"
versionCode 243
versionName "1.16.26"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@@ -84,7 +84,11 @@
<release version="1.16.25" date="2026-4-23">
<release version="1.16.26" date="2026-4-30">
<url>https://github.com/Materialious/Materialious/releases/tag/1.16.26</url>
</release>
<release version="1.16.25" date="2026-4-23">
<url>https://github.com/Materialious/Materialious/releases/tag/1.16.25</url>
</release>
<release version="1.16.24" date="2026-4-07">
+76 -63
View File
@@ -1,82 +1,74 @@
{
"name": "Materialious",
"version": "1.16.25",
"version": "1.16.26",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.16.25",
"version": "1.16.26",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
"@types/jsdom": "^28.0.1",
"bgutils-js": "^3.2.0",
"capacitor-nodejs": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz",
"chokidar": "~5.0.0",
"electron-is-dev": "~2.0.0",
"electron-serve": "~3.0.0",
"electron-unhandled": "^4.0.1",
"electron-updater": "^6.8.3",
"electron-window-state": "^5.0.3",
"jsdom": "^29.0.1",
"jsdom": "^29.1.0",
"jsonfile": "^6.2.1",
"youtubei.js": "^17.0.1"
},
"devDependencies": {
"electron": "^41.2.1",
"electron": "^41.3.0",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^6.0.3"
}
},
"node_modules/@asamuzakjp/css-color": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz",
"integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==",
"version": "5.1.11",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz",
"integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==",
"license": "MIT",
"dependencies": {
"@csstools/css-calc": "^3.1.1",
"@csstools/css-color-parser": "^4.0.2",
"@asamuzakjp/generational-cache": "^1.0.1",
"@csstools/css-calc": "^3.2.0",
"@csstools/css-color-parser": "^4.1.0",
"@csstools/css-parser-algorithms": "^4.0.0",
"@csstools/css-tokenizer": "^4.0.0",
"lru-cache": "^11.2.6"
"@csstools/css-tokenizer": "^4.0.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
"node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
"version": "11.2.7",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
"integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==",
"license": "BlueOak-1.0.0",
"engines": {
"node": "20 || >=22"
}
},
"node_modules/@asamuzakjp/dom-selector": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.3.tgz",
"integrity": "sha512-Q6mU0Z6bfj6YvnX2k9n0JxiIwrCFN59x/nWmYQnAqP000ruX/yV+5bp/GRcF5T8ncvfwJQ7fgfP74DlpKExILA==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz",
"integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==",
"license": "MIT",
"dependencies": {
"@asamuzakjp/generational-cache": "^1.0.1",
"@asamuzakjp/nwsapi": "^2.3.9",
"bidi-js": "^1.0.3",
"css-tree": "^3.2.1",
"is-potential-custom-element-name": "^1.0.1",
"lru-cache": "^11.2.7"
"is-potential-custom-element-name": "^1.0.1"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
"node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": {
"version": "11.2.7",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
"integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==",
"license": "BlueOak-1.0.0",
"node_modules/@asamuzakjp/generational-cache": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz",
"integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==",
"license": "MIT",
"engines": {
"node": "20 || >=22"
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
"node_modules/@asamuzakjp/nwsapi": {
@@ -251,9 +243,9 @@
}
},
"node_modules/@csstools/css-calc": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz",
"integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz",
"integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==",
"funding": [
{
"type": "github",
@@ -274,9 +266,9 @@
}
},
"node_modules/@csstools/css-color-parser": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz",
"integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz",
"integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==",
"funding": [
{
"type": "github",
@@ -290,7 +282,7 @@
"license": "MIT",
"dependencies": {
"@csstools/color-helpers": "^6.0.2",
"@csstools/css-calc": "^3.1.1"
"@csstools/css-calc": "^3.2.0"
},
"engines": {
"node": ">=20.19.0"
@@ -323,9 +315,9 @@
}
},
"node_modules/@csstools/css-syntax-patches-for-csstree": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz",
"integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz",
"integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==",
"funding": [
{
"type": "github",
@@ -2515,6 +2507,15 @@
"node": ">= 0.4"
}
},
"node_modules/capacitor-nodejs": {
"version": "1.0.0-beta.9",
"resolved": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz",
"integrity": "sha512-4EU/QBolfuyHiMtwd1nxZ4wsK243tGE4VttKvVBG+x1yQuK9EIlEf3lbRjFXfjrJMTZNCqaP6glmdfj9Zo7KVg==",
"license": "MIT",
"peerDependencies": {
"@capacitor/core": ">=7.0.0"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -3142,9 +3143,9 @@
}
},
"node_modules/electron": {
"version": "41.2.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-41.2.1.tgz",
"integrity": "sha512-teeRThiYGTPKf/2yOW7zZA1bhb91KEQ4yLBPOg7GxpmnkLFLugKgQaAKOrCgdzwsXh/5mFIfmkm+4+wACJKwaA==",
"version": "41.3.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-41.3.0.tgz",
"integrity": "sha512-2Q5aeocmFdeheZGDUTrAvSR3t+n0c3d104AJWWEnt7syJU0tE4VdibMYaPtQ47QuXSoUf0/xSsfUUvu/uSXIfg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -4487,27 +4488,27 @@
"license": "MIT"
},
"node_modules/jsdom": {
"version": "29.0.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.1.tgz",
"integrity": "sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==",
"version": "29.1.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.0.tgz",
"integrity": "sha512-YNUc7fB9QuvSSQWfrH0xF+TyABkxUwx8sswgIDaCrw4Hol8BghdZDkITtZheRJeMtzWlnTfsM3bBBusRvpO1wg==",
"license": "MIT",
"dependencies": {
"@asamuzakjp/css-color": "^5.0.1",
"@asamuzakjp/dom-selector": "^7.0.3",
"@asamuzakjp/css-color": "^5.1.11",
"@asamuzakjp/dom-selector": "^7.1.1",
"@bramus/specificity": "^2.4.2",
"@csstools/css-syntax-patches-for-csstree": "^1.1.1",
"@csstools/css-syntax-patches-for-csstree": "^1.1.3",
"@exodus/bytes": "^1.15.0",
"css-tree": "^3.2.1",
"data-urls": "^7.0.0",
"decimal.js": "^10.6.0",
"html-encoding-sniffer": "^6.0.0",
"is-potential-custom-element-name": "^1.0.1",
"lru-cache": "^11.2.7",
"parse5": "^8.0.0",
"lru-cache": "^11.3.5",
"parse5": "^8.0.1",
"saxes": "^6.0.0",
"symbol-tree": "^3.2.4",
"tough-cookie": "^6.0.1",
"undici": "^7.24.5",
"undici": "^7.25.0",
"w3c-xmlserializer": "^5.0.0",
"webidl-conversions": "^8.0.1",
"whatwg-mimetype": "^5.0.0",
@@ -4527,9 +4528,9 @@
}
},
"node_modules/jsdom/node_modules/lru-cache": {
"version": "11.2.7",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
"integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==",
"version": "11.3.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz",
"integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==",
"license": "BlueOak-1.0.0",
"engines": {
"node": "20 || >=22"
@@ -5320,17 +5321,29 @@
"license": "BlueOak-1.0.0"
},
"node_modules/parse5": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz",
"integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==",
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz",
"integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==",
"license": "MIT",
"dependencies": {
"entities": "^6.0.0"
"entities": "^8.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5/node_modules/entities": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz",
"integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=20.19.0"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -6447,9 +6460,9 @@
}
},
"node_modules/undici": {
"version": "7.24.5",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz",
"integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==",
"version": "7.25.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz",
"integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==",
"license": "MIT",
"engines": {
"node": ">=20.18.1"
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.16.25",
"version": "1.16.26",
"description": "Modern material design for YouTube and Invidious.",
"author": {
"name": "Ward Pearce",
@@ -31,12 +31,12 @@
"electron-unhandled": "^4.0.1",
"electron-updater": "^6.8.3",
"electron-window-state": "^5.0.3",
"jsdom": "^29.0.1",
"jsdom": "^29.1.0",
"jsonfile": "^6.2.1",
"youtubei.js": "^17.0.1"
},
"devDependencies": {
"electron": "^41.2.1",
"electron": "^41.3.0",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^6.0.3"
@@ -45,4 +45,4 @@
"capacitor",
"electron"
]
}
}
+13 -13
View File
@@ -1,12 +1,12 @@
{
"name": "materialious",
"version": "1.16.25",
"version": "1.16.26",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
"version": "1.16.25",
"version": "1.16.26",
"hasInstallScript": true,
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
@@ -31,7 +31,7 @@
"comlink": "^4.4.2",
"cookie-signature": "^1.2.2",
"dayjs": "^1.11.19",
"dexie": "^4.3.0",
"dexie": "^4.4.2",
"fuse.js": "^7.0.0",
"googlevideo": "^4.0.4",
"he": "^1.2.0",
@@ -40,7 +40,7 @@
"iso-3166": "^4.4.0",
"iso-639-1": "^3.1.5",
"jsdom": "^28.1.0",
"libsodium-wrappers-sumo": "^0.8.2",
"libsodium-wrappers-sumo": "^0.8.4",
"mariadb": "^3.5.2",
"material-dynamic-colors": "^1.1.1",
"media-captions": "^0.0.18",
@@ -9152,9 +9152,9 @@
"license": "MIT"
},
"node_modules/dexie": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/dexie/-/dexie-4.3.0.tgz",
"integrity": "sha512-5EeoQpJvMKHe6zWt/FSIIuRa3CWlZeIl6zKXt+Lz7BU6RoRRLgX9dZEynRfXrkLcldKYCBiz7xekTEylnie1Ug==",
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/dexie/-/dexie-4.4.2.tgz",
"integrity": "sha512-zMtV8q79EFE5U8FKZvt0Y/77PCU/Hr/RDxv1EDeo228L+m/HTbeN2AjoQm674rhQCX8n3ljK87lajt7UQuZfvw==",
"license": "Apache-2.0"
},
"node_modules/dezalgo": {
@@ -10302,9 +10302,9 @@
}
},
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
"integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
"funding": [
{
"type": "individual",
@@ -12779,9 +12779,9 @@
"license": "ISC"
},
"node_modules/libsodium-wrappers-sumo": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.8.2.tgz",
"integrity": "sha512-wd1xAY++Kr6VMikSaa4EPRAHJmFvNlGWiiwU3Jh3GR1zRYF3/I3vy/wYsr4k3LVsNzwb9sqfEQ4LdVQ6zEebyQ==",
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.8.4.tgz",
"integrity": "sha512-ql7hcgulKZ3ekfa2DGAogcCKsWU0diA/0nArz1CFzh93WQdb46/Kj18ka/Hifq6uA3Ush34Pc6vU/6HXeRwUkg==",
"license": "ISC",
"dependencies": {
"libsodium-sumo": "^0.8.0"
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.16.25",
"version": "1.16.26",
"private": true,
"scripts": {
"dev": "npm run patch:github && vite dev",
@@ -70,7 +70,7 @@
"comlink": "^4.4.2",
"cookie-signature": "^1.2.2",
"dayjs": "^1.11.19",
"dexie": "^4.3.0",
"dexie": "^4.4.2",
"fuse.js": "^7.0.0",
"googlevideo": "^4.0.4",
"he": "^1.2.0",
@@ -79,7 +79,7 @@
"iso-3166": "^4.4.0",
"iso-639-1": "^3.1.5",
"jsdom": "^28.1.0",
"libsodium-wrappers-sumo": "^0.8.2",
"libsodium-wrappers-sumo": "^0.8.4",
"mariadb": "^3.5.2",
"material-dynamic-colors": "^1.1.1",
"media-captions": "^0.0.18",
@@ -29,6 +29,7 @@
} from '../../store';
import { isOwnBackend } from '$lib/shared';
import ComboBox from '../ComboBox.svelte';
import { corsProxyUrl } from '$lib/fetchProxy';
let invidiousInstance = $state(get(invidiousInstanceStore));
@@ -59,9 +60,9 @@
interfaceAllowInsecureRequests.subscribe(async (isAllowed) => {
if (Capacitor.getPlatform() === 'android') {
if (isAllowed) {
await fetch('http://materialious__allow-insecure-requests');
await fetch(corsProxyUrl + 'allow-insecure-requests');
} else {
await fetch('http://materialious__deny-insecure-requests');
await fetch(corsProxyUrl + 'deny-insecure-requests');
}
} else if (Capacitor.getPlatform() === 'electron') {
await window.electronAPI.setAllowInsecureSSL(isAllowed);
@@ -1,5 +1,5 @@
<script lang="ts">
import { getBestThumbnail } from '$lib/images';
import { getBestThumbnail, imageHandleCors } from '$lib/images';
import { resolve } from '$app/paths';
import { letterCase } from '$lib/letterCasing';
import { _ } from '$lib/i18n';
@@ -23,7 +23,7 @@
thumbnailSrc = playlist.playlistThumbnail;
}
const thumbnail = new Avatar({ src: thumbnailSrc });
const thumbnail = new Avatar({ src: imageHandleCors(thumbnailSrc) });
</script>
<a href={playlistLink} style="width: 100%; overflow: hidden;min-height:100px;" class="wave">
@@ -1,6 +1,6 @@
<script lang="ts">
import { resolve } from '$app/paths';
import { getBestThumbnail } from '$lib/images';
import { getBestThumbnail, imageHandleCors } from '$lib/images';
import { letterCase } from '$lib/letterCasing';
import { cleanNumber, videoLength } from '$lib/numbers';
import { onDestroy, onMount } from 'svelte';
@@ -78,7 +78,7 @@
let thumbnailElement: HTMLElement | undefined = $state();
const thumbnail = new Avatar({
src: () => thumbnailSrc,
src: () => imageHandleCors(thumbnailSrc),
onLoadingStatusChange: () => {
if (thumbnailImageElement) thumbnailHeight = thumbnailImageElement.naturalHeight;
}
+1 -1
View File
@@ -4,7 +4,7 @@ import sodium from 'libsodium-wrappers-sumo';
import { isOwnBackend } from './shared';
export const originalFetch = window.fetch;
const corsProxyUrl =
export const corsProxyUrl =
Capacitor.getPlatform() === 'android'
? 'http://localhost:3000/'
: `${location.origin}/api/proxy/`;
+11 -2
View File
@@ -134,7 +134,15 @@
"darkMode": "Dunkler Modus",
"lightMode": "Heller Modus",
"AmoledTheme": "Amoled-Thema",
"color": "Farbe"
"color": "Farbe",
"advanced": "Erweitertes Theming",
"borderRadius": {
"none": "Keine",
"modern": "Modern",
"rounded": "Abgerundet",
"slight": "Leicht",
"borderRadius": "Eckenabrundung"
}
},
"searchSuggestions": "Suchvorschläge",
"previewVideoOnHover": "Video-Vorschau beim Hovern",
@@ -242,7 +250,8 @@
"exportSub": "Abonnements exportieren",
"exportToClipboard": "In die Zwischenablage exportieren",
"exportToFile": "In eine Datei exportieren",
"importFromFile": "Von einer Datei importieren"
"importFromFile": "Von einer Datei importieren",
"exportToShareUrl": "Exportieren um URL zu teilen"
}
},
"subscribe": "Abonnieren",
+11 -2
View File
@@ -70,7 +70,15 @@
"darkMode": "Dunkle Modus",
"lightMode": "Helle Modus",
"AmoledTheme": "Amoled-Thema",
"color": "Farb"
"color": "Farb",
"advanced": "Erwiiterts Theming",
"borderRadius": {
"none": "Keini",
"slight": "Liecht",
"modern": "Modern",
"rounded": "Abgrundet",
"borderRadius": "Eggeabrundig"
}
},
"searchSuggestions": "Suechvorschläg",
"previewVideoOnHover": "Video-Vorschau bim Hovere",
@@ -139,7 +147,8 @@
"exportSub": "Abonnements exportiere",
"exportToClipboard": "I d Zwüscheablaag exportiere",
"exportToFile": "In e Datei exportiere",
"importFromFile": "Vonere Datei importiere"
"importFromFile": "Vonere Datei importiere",
"exportToShareUrl": "Exportiere zum d URL teile"
}
},
"videos": "Videos",
+13 -3
View File
@@ -69,7 +69,15 @@
"darkMode": "Sötét mód",
"lightMode": "Világos mód",
"AmoledTheme": "Amoled téma",
"color": "Szín"
"color": "Szín",
"advanced": "Speciális témázás",
"borderRadius": {
"none": "Nincs",
"slight": "Enyhe",
"modern": "Modern",
"rounded": "Lekerekített",
"borderRadius": "Szegélysugár"
}
},
"searchSuggestions": "Keresési javaslatok",
"previewVideoOnHover": "Videó előnézete az egérmutatóval",
@@ -160,8 +168,10 @@
"exportSub": "Feliratkozások exportálása",
"exportToClipboard": "Vágólapra másolás",
"exportToFile": "Mentés fájlba",
"importFromFile": "Importálás fájlból"
}
"importFromFile": "Importálás fájlból",
"exportToShareUrl": "Exportálás megosztási webcímre"
},
"preserveTranslation": "Eredeti fordítás használata"
},
"enabled": "Engedélyezve",
"donate": "Adományozás",
+13 -3
View File
@@ -138,7 +138,15 @@
"darkMode": "ダークモード",
"lightMode": "ライトモード",
"color": "色",
"AmoledTheme": "Amoled テーマ"
"AmoledTheme": "Amoled テーマ",
"advanced": "その他のテーマ設定",
"borderRadius": {
"none": "なし",
"borderRadius": "角の丸み",
"slight": "小",
"modern": "中",
"rounded": "大"
}
},
"searchSuggestions": "検索候補を表示",
"previewVideoOnHover": "マウスを乗せるとプレビュー",
@@ -246,8 +254,10 @@
"exportSub": "登録チャンネルをエクスポート",
"exportToClipboard": "クリップボードへエクスポート",
"exportToFile": "ファイルへエクスポート",
"importFromFile": "ファイルからインポート"
}
"importFromFile": "ファイルからインポート",
"exportToShareUrl": "共有URLにエクスポート"
},
"preserveTranslation": "オリジナルの翻訳を使用する"
},
"subscribe": "チャンネル登録",
"invidiousBlockWarning": "Invidious は、現在Googleにブロックされています。このインスタンスで動画が読み込めない場合、{android} 版または {desktop} 版の Materialious でこのインスタンスを使用し、動画取得を直接行う代替接続を使ってください。",
+1 -1
View File
@@ -166,7 +166,7 @@
"userJoined": "Lietotājs pievienojās jūsu skatīšanās ballītei.",
"userLeft": "Lietotājs pameta jūsu skatīšanās ballīti."
},
"invidiousLogin": "Lūdzu, autorizējieties ar savu Invidious kontu",
"invidiousLogin": "Lūdzu, autorizējieties ar savu Invidious kontu.",
"noResult": "Bez rezultātiem",
"letterCase": "Virsrakstu burtu reģistrs",
"version": "Versija",
+10
View File
@@ -2,6 +2,8 @@ import { get } from 'svelte/store';
import type { Image } from './api/model';
import { invidiousInstanceStore } from './store';
import { isYTBackend } from './misc';
import { Capacitor } from '@capacitor/core';
import { corsProxyUrl } from './fetchProxy';
export class ImageCache {
private cache = new Map<string, HTMLImageElement>();
@@ -67,3 +69,11 @@ export function proxyGoogleImage(source: string): string {
return `${get(invidiousInstanceStore)}/ggpht${path}`;
}
export function imageHandleCors(source: string): string {
if (Capacitor.getPlatform() === 'android') {
return corsProxyUrl + source;
}
return source;
}
+5 -21
View File
@@ -1,21 +1,8 @@
import { invidiousInstanceStore } from '$lib/store';
import { get } from 'svelte/store';
export async function manifestDomainInclusion(manifestUrl: string): Promise<string> {
const respIvg = await fetch(manifestUrl, {
method: 'GET',
headers: {
// Required for our custom android backend.
__redirect: 'manual'
},
referrerPolicy: 'no-referrer'
});
if (!respIvg.ok) {
throw Error('Unable to make request to Invidious');
}
// If location isn't present, then use base manifest URL.
const companionUrl = respIvg.headers.get('location') ?? manifestUrl;
const respCompanion = await fetch(companionUrl, {
const respCompanion = await fetch(manifestUrl, {
method: 'GET'
});
@@ -35,10 +22,7 @@ export async function manifestDomainInclusion(manifestUrl: string): Promise<stri
const baseUrlValue = baseUrlElement.textContent;
if (baseUrlValue && (baseUrlValue.startsWith('/') || !baseUrlValue.includes('://'))) {
const companionUrlObj = new URL(companionUrl);
const baseDomain = `${companionUrlObj.protocol}//${companionUrlObj.host}`;
const resolvedUrl = new URL(baseUrlValue, baseDomain).href;
baseUrlElement.textContent = resolvedUrl;
baseUrlElement.textContent = new URL(baseUrlValue, get(invidiousInstanceStore) ?? '').href;
}
}
@@ -1,6 +1,9 @@
import { isOwnBackend } from '$lib/shared';
import { env } from '$env/dynamic/public';
import { env as privateEnv } from '$env/dynamic/private';
import { Agent } from 'undici';
import fs from 'fs';
import tls from 'tls';
import { error } from '@sveltejs/kit';
import { parse as tldParse } from 'tldts';
@@ -59,6 +62,19 @@ for (const dynamicDomain of dynamicAllowDomainsEnvVars) {
}
}
let dispatcher: Agent;
const certPath = privateEnv.PROXY_TRUST_CA;
if (certPath && fs.existsSync(certPath)) {
dispatcher = new Agent({
connect: {
ca: [fs.readFileSync(certPath), ...tls.rootCertificates]
}
});
} else {
dispatcher = new Agent();
}
async function proxyRequest(
request: Request,
urlToProxy: string,
@@ -145,7 +161,9 @@ async function proxyRequest(
response = await fetch(urlToProxyObj.toString(), {
...requestOptions,
body,
signal: AbortSignal.timeout(10000)
signal: AbortSignal.timeout(10000),
// @ts-expect-error Node-specific option
dispatcher
});
} catch (err) {
errorMsg = (err as any).toString();
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -169,11 +169,11 @@ const server = http.createServer((req, res) => {
let targetUrl = req.url.slice(1);
// Quick way to quickly send commands between app and nodejs backend.
if (targetUrl === 'http://materialious__allow-insecure-requests') {
if (targetUrl === 'allow-insecure-requests') {
rejectUnauthorized = false;
res.writeHead(200);
return res.end();
} else if (targetUrl === 'http://materialious__deny-insecure-requests') {
} else if (targetUrl === 'deny-insecure-requests') {
rejectUnauthorized = true;
res.writeHead(200);
return res.end();
+1 -1
View File
@@ -3,7 +3,7 @@ import os
import re
from datetime import datetime
LATEST_VERSION = "1.16.25"
LATEST_VERSION = "1.16.26"
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")