From 7a7ebffbab9cf2a702b7e2b929a81cb449fd4ae6 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Tue, 23 Jun 2026 09:14:38 +0800 Subject: [PATCH 1/6] ^ Update youtubei.js to 17.2.0 --- package.json | 2 +- pnpm-lock.yaml | 188 ++++++++++--------------------------------------- 2 files changed, 40 insertions(+), 150 deletions(-) diff --git a/package.json b/package.json index 9f5496aa63043..6dba8015141cd 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "vue-observe-visibility": "^2.0.0-alpha.1", "vue-router": "^5.1.0", "vuex": "^4.1.0", - "youtubei.js": "^17.0.1" + "youtubei.js": "^17.2.0" }, "devDependencies": { "@babel/core": "^8.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34bbd1b1436fd..8360d5aa0e616 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,8 +75,8 @@ importers: specifier: ^4.1.0 version: 4.1.0(vue@3.5.38(typescript@6.0.3)) youtubei.js: - specifier: ^17.0.1 - version: 17.0.1 + specifier: ^17.2.0 + version: 17.2.0 devDependencies: '@babel/core': specifier: ^8.0.1 @@ -113,7 +113,7 @@ importers: version: 42.4.1 electron-builder: specifier: ^26.15.3 - version: 26.15.3(electron-builder-squirrel-windows@26.8.1) + version: 26.15.3(electron-builder-squirrel-windows@26.15.3) eslint: specifier: ^10.5.0 version: 10.5.0(jiti@2.7.0) @@ -210,9 +210,6 @@ importers: packages: - 7zip-bin@5.2.0: - resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -771,10 +768,6 @@ packages: peerDependencies: postcss-selector-parser: ^7.1.1 - '@develar/schema-utils@2.6.5': - resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} - engines: {node: '>= 8.9.0'} - '@discoveryjs/json-ext@1.1.0': resolution: {integrity: sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==} engines: {node: '>=14.17.0'} @@ -1225,36 +1218,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -1539,41 +1538,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -1741,11 +1748,6 @@ packages: ajv: optional: true - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: @@ -1782,9 +1784,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - app-builder-bin@5.0.0-alpha.12: - resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} - app-builder-lib@26.15.3: resolution: {integrity: sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==} engines: {node: '>=14.0.0'} @@ -1792,13 +1791,6 @@ packages: dmg-builder: 26.15.3 electron-builder-squirrel-windows: 26.15.3 - app-builder-lib@26.8.1: - resolution: {integrity: sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==} - engines: {node: '>=14.0.0'} - peerDependencies: - dmg-builder: 26.8.1 - electron-builder-squirrel-windows: 26.8.1 - are-docs-informative@0.0.2: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} @@ -1939,10 +1931,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - builder-util-runtime@9.5.1: - resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} - engines: {node: '>=12.0.0'} - builder-util-runtime@9.7.0: resolution: {integrity: sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==} engines: {node: '>=12.0.0'} @@ -1951,9 +1939,6 @@ packages: resolution: {integrity: sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==} engines: {node: '>=14.0.0'} - builder-util@26.8.1: - resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} - builtin-modules@5.2.0: resolution: {integrity: sha512-02yxLeyxF4dNl6SlY6/5HfRSrSdZ/sCPoxy2kZNP5dZZX8LSAD9aE2gtJIUgWrsQTiMPl3mxESyrobSwvRGisQ==} engines: {node: '>=18.20'} @@ -2428,8 +2413,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-builder-squirrel-windows@26.8.1: - resolution: {integrity: sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==} + electron-builder-squirrel-windows@26.15.3: + resolution: {integrity: sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==} electron-builder@26.15.3: resolution: {integrity: sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==} @@ -2451,9 +2436,6 @@ packages: electron-publish@26.15.3: resolution: {integrity: sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==} - electron-publish@26.8.1: - resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} - electron-to-chromium@1.5.376: resolution: {integrity: sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA==} @@ -2810,6 +2792,9 @@ packages: picomatch: optional: true + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + file-entry-cache@11.1.3: resolution: {integrity: sha512-oMbq0PD6VIiIwMF6LIa7MEwd/l9huKwmqRKXqmrkqIZv8CvRbfowL+L0ryAl8h//HfAS0zS+4SbYoRyAoA6BJA==} @@ -4493,7 +4478,6 @@ packages: shaka-player@5.1.10: resolution: {integrity: sha512-1QBR29E8d+6f5lNf1pDWAv1Bto7dpURipQg9opCA6HgBVe7rGbeQJUw7fy03h4ywLJB0IwJYl7U7zLQqWnGKHw==} - engines: {node: '>=18'} shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -5230,13 +5214,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - youtubei.js@17.0.1: - resolution: {integrity: sha512-1lO4b8UqMDzE0oh2qEGzbBOd4UYRdxn/4PdpRM7BGTHxM6ddsEsKZTu90jp8V9FHVgC2h1UirQyqoqLiKwl+Zg==} + youtubei.js@17.2.0: + resolution: {integrity: sha512-XLNsgRKO1h7t4i9tIMWSQSeWdD7Ujkk5v1m5YCaumaHMhu/xuLqtO3M0Hq7CXNup9HlJ1NGrT1Y+HLIHnL6Ujg==} snapshots: - 7zip-bin@5.2.0: {} - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -5870,11 +5852,6 @@ snapshots: dependencies: postcss-selector-parser: 7.1.4 - '@develar/schema-utils@2.6.5': - dependencies: - ajv: 6.15.0 - ajv-keywords: 3.5.2(ajv@6.15.0) - '@discoveryjs/json-ext@1.1.0': {} '@double-great/stylelint-a11y@3.4.15(stylelint@17.13.0(typescript@6.0.3))': @@ -7006,10 +6983,6 @@ snapshots: optionalDependencies: ajv: 8.20.0 - ajv-keywords@3.5.2(ajv@6.15.0): - dependencies: - ajv: 6.15.0 - ajv-keywords@5.1.0(ajv@8.20.0): dependencies: ajv: 8.20.0 @@ -7046,9 +7019,7 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 - app-builder-bin@5.0.0-alpha.12: {} - - app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.8.1): + app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3): dependencies: '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 @@ -7069,11 +7040,11 @@ snapshots: chromium-pickle-js: 0.2.0 ci-info: 4.3.1 debug: 4.4.3 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.8.1) + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) dotenv: 16.6.1 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 26.8.1(dmg-builder@26.15.3) + electron-builder-squirrel-windows: 26.15.3(dmg-builder@26.15.3) electron-publish: 26.15.3 fs-extra: 10.1.0 hosted-git-info: 4.1.0 @@ -7096,49 +7067,6 @@ snapshots: transitivePeerDependencies: - supports-color - app-builder-lib@26.8.1(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.8.1): - dependencies: - '@develar/schema-utils': 2.6.5 - '@electron/asar': 3.4.1 - '@electron/fuses': 1.8.0 - '@electron/get': 3.1.0 - '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.3 - '@electron/rebuild': 4.0.4 - '@electron/universal': 2.0.3 - '@malept/flatpak-bundler': 0.4.0 - '@types/fs-extra': 9.0.13 - async-exit-hook: 2.0.1 - builder-util: 26.8.1 - builder-util-runtime: 9.5.1 - chromium-pickle-js: 0.2.0 - ci-info: 4.3.1 - debug: 4.4.3 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.8.1) - dotenv: 16.6.1 - dotenv-expand: 11.0.7 - ejs: 3.1.10 - electron-builder-squirrel-windows: 26.8.1(dmg-builder@26.15.3) - electron-publish: 26.8.1 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - isbinaryfile: 5.0.7 - jiti: 2.7.0 - js-yaml: 4.2.0 - json5: 2.2.3 - lazy-val: 1.0.5 - minimatch: 10.2.5 - plist: 3.1.0 - proper-lockfile: 4.1.2 - resedit: 1.7.2 - semver: 7.7.4 - tar: 7.5.16 - temp-file: 3.4.0 - tiny-async-pool: 1.3.0 - which: 5.0.0 - transitivePeerDependencies: - - supports-color - are-docs-informative@0.0.2: {} argparse@2.0.1: {} @@ -7271,13 +7199,6 @@ snapshots: buffer-from@1.1.2: {} - builder-util-runtime@9.5.1: - dependencies: - debug: 4.4.3 - sax: 1.6.0 - transitivePeerDependencies: - - supports-color - builder-util-runtime@9.7.0: dependencies: debug: 4.4.3 @@ -7304,27 +7225,6 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util@26.8.1: - dependencies: - 7zip-bin: 5.2.0 - '@types/debug': 4.1.13 - app-builder-bin: 5.0.0-alpha.12 - builder-util-runtime: 9.5.1 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - fs-extra: 10.1.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - js-yaml: 4.2.0 - sanitize-filename: 1.6.4 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - tiny-async-pool: 1.3.0 - transitivePeerDependencies: - - supports-color - builtin-modules@5.2.0: {} bundle-name@4.1.0: @@ -7724,9 +7624,9 @@ snapshots: minimatch: 3.1.5 p-limit: 3.1.0 - dmg-builder@26.15.3(electron-builder-squirrel-windows@26.8.1): + dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.8.1) + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) builder-util: 26.15.3 fs-extra: 10.1.0 js-yaml: 4.2.0 @@ -7809,23 +7709,23 @@ snapshots: dependencies: jake: 10.9.4 - electron-builder-squirrel-windows@26.8.1(dmg-builder@26.15.3): + electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3): dependencies: - app-builder-lib: 26.8.1(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.8.1) - builder-util: 26.8.1 + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) + builder-util: 26.15.3 electron-winstaller: 5.4.0 transitivePeerDependencies: - dmg-builder - supports-color - electron-builder@26.15.3(electron-builder-squirrel-windows@26.8.1): + electron-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.8.1) + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) builder-util: 26.15.3 builder-util-runtime: 9.7.0 chalk: 4.1.2 ci-info: 4.4.0 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.8.1) + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -7862,19 +7762,6 @@ snapshots: transitivePeerDependencies: - supports-color - electron-publish@26.8.1: - dependencies: - '@types/fs-extra': 9.0.13 - builder-util: 26.8.1 - builder-util-runtime: 9.5.1 - chalk: 4.1.2 - form-data: 4.0.6 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 - transitivePeerDependencies: - - supports-color - electron-to-chromium@1.5.376: {} electron-winstaller@5.4.0: @@ -8293,6 +8180,8 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fflate@0.8.3: {} + file-entry-cache@11.1.3: dependencies: flat-cache: 6.1.22 @@ -10729,7 +10618,8 @@ snapshots: yocto-queue@0.1.0: {} - youtubei.js@17.0.1: + youtubei.js@17.2.0: dependencies: '@bufbuild/protobuf': 2.1.0 + fflate: 0.8.3 meriyah: 6.1.4 From 7d583e4c8114fc0ccf6399ebde6f3f1376fa88b8 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Tue, 23 Jun 2026 09:15:06 +0800 Subject: [PATCH 2/6] * Update pnpm to add youtubei.js to minimumReleaseAgeExclude --- pnpm-workspace.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8a3d7c2824a9c..543675b4d9b40 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,3 +11,6 @@ allowBuilds: overrides: uuid@<11.1.1: '>=11.1.1' + +minimumReleaseAgeExclude: +- "youtubei.js" From f5d3170e478712ba00b83b3072f774801f6eb3b8 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Thu, 25 Jun 2026 08:45:42 +0800 Subject: [PATCH 3/6] * Revert all workarounds for LockupView --- src/renderer/helpers/api/local.js | 12 +++--------- src/renderer/views/Channel/Channel.vue | 20 +++++--------------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index e93c2f81cec30..e9db1f8e8f098 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -736,9 +736,7 @@ export async function getLocalChannelVideos(id) { // if the channel doesn't have a videos tab, YouTube returns the home tab instead // so we need to check that we got the right tab if (videosTab.current_tab?.endpoint.metadata.url?.endsWith('/videos')) { - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // videos = parseLocalChannelVideos(videosTab.videos, channelId, name) - videos = parseLocalChannelVideos([...videosTab.memo.getType(YTNodes.LockupView)], channelId, name) + videos = parseLocalChannelVideos(videosTab.videos, channelId, name) } else if (name.endsWith('- Topic') && !!videosTab.metadata.music_artist_name) { try { const playlist = await innertube.getPlaylist(getChannelPlaylistId(channelId, 'videos', 'newest')) @@ -798,14 +796,10 @@ export async function getLocalChannelLiveStreams(id) { // work around YouTube bug where it will return a bunch of responses with only continuations in them // e.g. https://www.youtube.com/@TWLIVES/streams - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // let tempVideos = liveStreamsTab.videos - let tempVideos = [...liveStreamsTab.memo.getType(YTNodes.LockupView)] + let tempVideos = liveStreamsTab.videos while (tempVideos.length === 0 && liveStreamsTab.has_continuation) { liveStreamsTab = await liveStreamsTab.getContinuation() - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // tempVideos = liveStreamsTab.videos - tempVideos = [...liveStreamsTab.memo.getType(YTNodes.LockupView)] + tempVideos = liveStreamsTab.videos } videos = parseLocalChannelVideos(tempVideos, channelId, name) diff --git a/src/renderer/views/Channel/Channel.vue b/src/renderer/views/Channel/Channel.vue index af98c5c97d1be..254e87d70277f 100644 --- a/src/renderer/views/Channel/Channel.vue +++ b/src/renderer/views/Channel/Channel.vue @@ -1111,9 +1111,7 @@ async function getChannelVideosLocal() { return } - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // latestVideos.value = parseLocalChannelVideos(videosTab.videos, id.value, channelName.value) - latestVideos.value = parseLocalChannelVideos([...videosTab.memo.getType(YTNodes.LockupView)], id.value, channelName.value) + latestVideos.value = parseLocalChannelVideos(videosTab.videos, id.value, channelName.value) videoContinuationData.value = videosTab.has_continuation ? videosTab : null isElementListLoading.value = false } @@ -1158,9 +1156,7 @@ async function getChannelVideosLocalMore() { */ const continuation = await videoContinuationData.value.getContinuation() - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // latestVideos.value = latestVideos.value.concat(parseLocalChannelVideos(continuation.videos, id.value, channelName.value)) - latestVideos.value = latestVideos.value.concat(parseLocalChannelVideos([...continuation.memo.getType(YTNodes.LockupView)], id.value, channelName.value)) + latestVideos.value = latestVideos.value.concat(parseLocalChannelVideos(continuation.videos, id.value, channelName.value)) videoContinuationData.value = continuation.has_continuation ? continuation : null } } catch (err) { @@ -1399,14 +1395,10 @@ async function getChannelLiveLocal() { // work around YouTube bug where it will return a bunch of responses with only continuations in them // e.g. https://www.youtube.com/@TWLIVES/streams - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // let videos = liveTab.videos - let videos = [...liveTab.memo.getType(YTNodes.LockupView)] + let videos = liveTab.videos while (videos.length === 0 && liveTab.has_continuation) { liveTab = await liveTab.getContinuation() - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // videos = liveTab.videos - videos = [...liveTab.memo.getType(YTNodes.LockupView)] + videos = liveTab.videos } latestLive.value = parseLocalChannelVideos(videos, id.value, channelName.value) @@ -1441,9 +1433,7 @@ async function getChannelLiveLocalMore() { */ const continuation = await liveContinuationData.value.getContinuation() - // TODO: restore usage of official API instead of memo after youtubei.js 17.1.0 released - // latestLive.value = latestLive.value.concat(parseLocalChannelVideos(continuation.videos, id.value, channelName.value)) - latestLive.value = latestLive.value.concat(parseLocalChannelVideos([...continuation.memo.getType(YTNodes.LockupView)], id.value, channelName.value)) + latestLive.value = latestLive.value.concat(parseLocalChannelVideos(continuation.videos, id.value, channelName.value)) liveContinuationData.value = continuation.has_continuation ? continuation : null } catch (err) { console.error(err) From 4df9da2be5c8130f102a3430f9a5a050de0d20f4 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Thu, 25 Jun 2026 08:46:27 +0800 Subject: [PATCH 4/6] ! Fix LockupView handling in playlist --- src/renderer/helpers/api/local.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index e9db1f8e8f098..424de725d82e7 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -1350,6 +1350,8 @@ export function parseLocalPlaylistVideo(video) { viewCount, lengthSeconds: '' } + } else if (video.type === 'LockupView') { + return parseLockupView(video) } else { /** @type {import('youtubei.js').YTNodes.PlaylistVideo} */ const video_ = video From 29221bc29e78a561a760ba79fde41a8a9a3cc2a4 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Sat, 27 Jun 2026 19:19:00 +0800 Subject: [PATCH 5/6] ! Fix playlist continuation caching --- src/renderer/helpers/api/local.js | 37 ++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index 424de725d82e7..5178655874deb 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -140,22 +140,22 @@ export async function getLocalPlaylist(id) { */ /** - * @param {import('youtubei.js').YTNodes.ContinuationItem} continuationItem + * @param {import('youtubei.js').YTNodes.ContinuationItem | import('youtubei.js').YTNodes.ContinuationItemView} continuationItemOrView * @param {import('youtubei.js').Actions} actions */ -function serializeContinuationItem(continuationItem, actions) { +function serializeContinuation(continuationItemOrView, actions) { let path, payload // Based on YouTube.js' NavigationEndpoint#call() - if (continuationItem.endpoint.command.is(YTNodes.CommandExecutorCommand)) { + if (continuationItemOrView.endpoint.command.is(YTNodes.CommandExecutorCommand)) { /** @type {import('youtubei.js').Helpers.YTNode & import('youtubei.js').APIResponseTypes.IEndpoint} */ - const command = continuationItem.endpoint.command.commands.at(-1) + const command = continuationItemOrView.endpoint.command.commands.at(-1) path = command.getApiPath() payload = command.buildRequest() } else { - path = continuationItem.endpoint.metadata.api_url - payload = continuationItem.endpoint.payload + path = continuationItemOrView.endpoint.metadata.api_url + payload = continuationItemOrView.endpoint.payload } /** @type {SerializedContinuation} */ @@ -169,18 +169,21 @@ function serializeContinuationItem(continuationItem, actions) { } /** + * @template {import('youtubei.js').YTNodes} N * @param {import('youtubei.js').Mixins.Feed} feed + * @param {N.constructor} type + * @return {N} */ -function extractFeedContinuationItem(feed) { +function extractFeedContinuation(feed, type = YTNodes.ContinuationItem) { let continuationItem if (feed.page.header_memo) { - const headerContinuations = feed.page.header_memo.getType(YTNodes.ContinuationItem) - continuationItem = feed.memo.getType(YTNodes.ContinuationItem).find( + const headerContinuations = feed.page.header_memo.getType(type) + continuationItem = feed.memo.getType(type).find( (continuation) => !headerContinuations.includes(continuation) ) } else { - continuationItem = feed.memo.getType(YTNodes.ContinuationItem)[0] + continuationItem = feed.memo.getType(type)[0] } if (!continuationItem) { @@ -198,21 +201,25 @@ export function extractLocalCacheablePlaylistContinuation(playlist) { const sectionList = playlist.memo.getType(YTNodes.SectionList)[0] let continuationItem + let continuationItemView // No section list means there can't be additional continuation nodes here, // so no need to check. if (!sectionList) { - continuationItem = extractFeedContinuationItem(playlist) + continuationItem = extractFeedContinuation(playlist, YTNodes.ContinuationItem) + continuationItemView = extractFeedContinuation(playlist, YTNodes.ContinuationItemView) } else { continuationItem = playlist.memo.getType(YTNodes.ContinuationItem) .find((node) => !sectionList.contents.includes(node)) + continuationItemView = playlist.memo.getType(YTNodes.ContinuationItemView) + .find((node) => !sectionList.contents.includes(node)) } - if (!continuationItem) { + if (!continuationItem && !continuationItemView) { throw new Utils.InnertubeError('There are no continuations.') } - return serializeContinuationItem(continuationItem, playlist.actions) + return serializeContinuation(continuationItem || continuationItemView, playlist.actions) } /** @@ -221,9 +228,9 @@ export function extractLocalCacheablePlaylistContinuation(playlist) { * @returns {SerializedContinuation} */ export function extractLocalCacheableSearchContinuation(search) { - const continuationItem = extractFeedContinuationItem(search) + const continuationItem = extractFeedContinuation(search, YTNodes.ContinuationItem) - return serializeContinuationItem(continuationItem, search.actions) + return serializeContinuation(continuationItem, search.actions) } /** From 9d32fbe91949d8616ccf19fed708e07ec68046a2 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Sun, 28 Jun 2026 08:55:42 +0800 Subject: [PATCH 6/6] $ Simpliy getType usage since it accepts multiple types --- src/renderer/helpers/api/local.js | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index 5178655874deb..71d09616d6c17 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -171,19 +171,19 @@ function serializeContinuation(continuationItemOrView, actions) { /** * @template {import('youtubei.js').YTNodes} N * @param {import('youtubei.js').Mixins.Feed} feed - * @param {N.constructor} type + * @param {import('youtubei.js').YTNodeConstructor[]} types * @return {N} */ -function extractFeedContinuation(feed, type = YTNodes.ContinuationItem) { +function extractFeedContinuation(feed, types) { let continuationItem if (feed.page.header_memo) { - const headerContinuations = feed.page.header_memo.getType(type) - continuationItem = feed.memo.getType(type).find( + const headerContinuations = feed.page.header_memo.getType(...types) + continuationItem = feed.memo.getType(...types).find( (continuation) => !headerContinuations.includes(continuation) ) } else { - continuationItem = feed.memo.getType(type)[0] + continuationItem = feed.memo.getType(types)[0] } if (!continuationItem) { @@ -200,26 +200,22 @@ function extractFeedContinuation(feed, type = YTNodes.ContinuationItem) { export function extractLocalCacheablePlaylistContinuation(playlist) { const sectionList = playlist.memo.getType(YTNodes.SectionList)[0] - let continuationItem - let continuationItemView + let continuationItemOrView // No section list means there can't be additional continuation nodes here, // so no need to check. if (!sectionList) { - continuationItem = extractFeedContinuation(playlist, YTNodes.ContinuationItem) - continuationItemView = extractFeedContinuation(playlist, YTNodes.ContinuationItemView) + continuationItemOrView = extractFeedContinuation(playlist, [YTNodes.ContinuationItem, YTNodes.ContinuationItemView]) } else { - continuationItem = playlist.memo.getType(YTNodes.ContinuationItem) - .find((node) => !sectionList.contents.includes(node)) - continuationItemView = playlist.memo.getType(YTNodes.ContinuationItemView) + continuationItemOrView = playlist.memo.getType(YTNodes.ContinuationItem, YTNodes.ContinuationItemView) .find((node) => !sectionList.contents.includes(node)) } - if (!continuationItem && !continuationItemView) { + if (!continuationItemOrView) { throw new Utils.InnertubeError('There are no continuations.') } - return serializeContinuation(continuationItem || continuationItemView, playlist.actions) + return serializeContinuation(continuationItemOrView, playlist.actions) } /** @@ -228,7 +224,7 @@ export function extractLocalCacheablePlaylistContinuation(playlist) { * @returns {SerializedContinuation} */ export function extractLocalCacheableSearchContinuation(search) { - const continuationItem = extractFeedContinuation(search, YTNodes.ContinuationItem) + const continuationItem = extractFeedContinuation(search, [YTNodes.ContinuationItem]) return serializeContinuation(continuationItem, search.actions) }