Compare commits

..

1 Commits

Author SHA1 Message Date
80ef7a2abe chore(deps): update actions/github-script action to v8 2026-01-22 14:07:01 +00:00
7 changed files with 91 additions and 277 deletions

View File

@ -103,7 +103,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Create comment - name: Create comment
uses: actions/github-script@v7 uses: actions/github-script@v8
with: with:
script: | script: |
const runId = context.runId; const runId = context.runId;

View File

@ -71,7 +71,7 @@
"@floating-ui/dom": "1.7.4", "@floating-ui/dom": "1.7.4",
"@foobar404/wave": "2.0.5", "@foobar404/wave": "2.0.5",
"@ghostery/adblocker-electron": "2.13.4", "@ghostery/adblocker-electron": "2.13.4",
"@ghostery/adblocker-electron-preload": "2.13.4", "@ghostery/adblocker-electron-preload": "2.11.6",
"@hono/node-server": "1.19.9", "@hono/node-server": "1.19.9",
"@hono/node-ws": "1.2.0", "@hono/node-ws": "1.2.0",
"@hono/swagger-ui": "0.5.3", "@hono/swagger-ui": "0.5.3",
@ -106,7 +106,7 @@
"filenamify": "6.0.0", "filenamify": "6.0.0",
"hanja": "1.1.5", "hanja": "1.1.5",
"happy-dom": "20.0.11", "happy-dom": "20.0.11",
"hono": "4.11.7", "hono": "4.11.4",
"howler": "2.2.4", "howler": "2.2.4",
"html-to-text": "9.0.5", "html-to-text": "9.0.5",
"i18next": "25.5.2", "i18next": "25.5.2",
@ -142,7 +142,7 @@
"@eslint/js": "9.39.2", "@eslint/js": "9.39.2",
"@malept/flatpak-bundler": "0.4.0", "@malept/flatpak-bundler": "0.4.0",
"@playwright/test": "1.57.0", "@playwright/test": "1.57.0",
"@stylistic/eslint-plugin": "5.7.1", "@stylistic/eslint-plugin": "5.7.0",
"@total-typescript/ts-reset": "0.6.1", "@total-typescript/ts-reset": "0.6.1",
"@types/electron-localshortcut": "3.1.3", "@types/electron-localshortcut": "3.1.3",
"@types/howler": "2.2.12", "@types/howler": "2.2.12",

104
pnpm-lock.yaml generated
View File

@ -61,23 +61,23 @@ importers:
specifier: 2.13.4 specifier: 2.13.4
version: 2.13.4(electron@38.7.2) version: 2.13.4(electron@38.7.2)
'@ghostery/adblocker-electron-preload': '@ghostery/adblocker-electron-preload':
specifier: 2.13.4 specifier: 2.11.6
version: 2.13.4(electron@38.7.2) version: 2.11.6(electron@38.7.2)
'@hono/node-server': '@hono/node-server':
specifier: 1.19.9 specifier: 1.19.9
version: 1.19.9(hono@4.11.7) version: 1.19.9(hono@4.11.4)
'@hono/node-ws': '@hono/node-ws':
specifier: 1.2.0 specifier: 1.2.0
version: 1.2.0(@hono/node-server@1.19.9(hono@4.11.7))(bufferutil@4.1.0)(hono@4.11.7)(utf-8-validate@6.0.6) version: 1.2.0(@hono/node-server@1.19.9(hono@4.11.4))(bufferutil@4.1.0)(hono@4.11.4)(utf-8-validate@6.0.6)
'@hono/swagger-ui': '@hono/swagger-ui':
specifier: 0.5.3 specifier: 0.5.3
version: 0.5.3(hono@4.11.7) version: 0.5.3(hono@4.11.4)
'@hono/zod-openapi': '@hono/zod-openapi':
specifier: 1.2.0 specifier: 1.2.0
version: 1.2.0(hono@4.11.7)(zod@4.2.1) version: 1.2.0(hono@4.11.4)(zod@4.2.1)
'@hono/zod-validator': '@hono/zod-validator':
specifier: 0.7.6 specifier: 0.7.6
version: 0.7.6(hono@4.11.7)(zod@4.2.1) version: 0.7.6(hono@4.11.4)(zod@4.2.1)
'@jellybrick/dbus-next': '@jellybrick/dbus-next':
specifier: 0.10.3 specifier: 0.10.3
version: 0.10.3 version: 0.10.3
@ -166,8 +166,8 @@ importers:
specifier: 20.0.11 specifier: 20.0.11
version: 20.0.11 version: 20.0.11
hono: hono:
specifier: 4.11.7 specifier: 4.11.4
version: 4.11.7 version: 4.11.4
howler: howler:
specifier: 2.2.4 specifier: 2.2.4
version: 2.2.4 version: 2.2.4
@ -266,8 +266,8 @@ importers:
specifier: 1.57.0 specifier: 1.57.0
version: 1.57.0 version: 1.57.0
'@stylistic/eslint-plugin': '@stylistic/eslint-plugin':
specifier: 5.7.1 specifier: 5.7.0
version: 5.7.1(eslint@9.39.2(jiti@2.6.1)) version: 5.7.0(eslint@9.39.2(jiti@2.6.1))
'@total-typescript/ts-reset': '@total-typescript/ts-reset':
specifier: 0.6.1 specifier: 0.6.1
version: 0.6.1 version: 0.6.1
@ -780,6 +780,11 @@ packages:
'@ghostery/adblocker-content@2.13.4': '@ghostery/adblocker-content@2.13.4':
resolution: {integrity: sha512-VPa4dyHqTyMWxut/wCYYlHdVRsQ2ZXXezTv31WiRhUC86LFKz8rL/Jnj1baHXlRrO5Ndhpll1/e/J/Tzwu6mqg==} resolution: {integrity: sha512-VPa4dyHqTyMWxut/wCYYlHdVRsQ2ZXXezTv31WiRhUC86LFKz8rL/Jnj1baHXlRrO5Ndhpll1/e/J/Tzwu6mqg==}
'@ghostery/adblocker-electron-preload@2.11.6':
resolution: {integrity: sha512-WU6vbixwgBtoc6Sx2jn/X5pw9vj3IXoYPhuE/Rm+TrD2nO/ywAOiNV0XkQp3hIHxpJ4GXv/VDJM3Cy6cX41Nhg==}
peerDependencies:
electron: '>11'
'@ghostery/adblocker-electron-preload@2.13.4': '@ghostery/adblocker-electron-preload@2.13.4':
resolution: {integrity: sha512-8lKTV+wQkhQd68l8V81DWVHEX1PzhYhhSFlouy3AF3JfNL2DWJm+m6Com0wOxm6ft5xV4YrZpkcFs2RZkbxyaQ==} resolution: {integrity: sha512-8lKTV+wQkhQd68l8V81DWVHEX1PzhYhhSFlouy3AF3JfNL2DWJm+m6Com0wOxm6ft5xV4YrZpkcFs2RZkbxyaQ==}
peerDependencies: peerDependencies:
@ -1139,28 +1144,24 @@ packages:
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53':
resolution: {integrity: sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==} resolution: {integrity: sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53':
resolution: {integrity: sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==} resolution: {integrity: sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@rolldown/binding-linux-x64-musl@1.0.0-beta.53': '@rolldown/binding-linux-x64-musl@1.0.0-beta.53':
resolution: {integrity: sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==} resolution: {integrity: sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@rolldown/binding-openharmony-arm64@1.0.0-beta.53': '@rolldown/binding-openharmony-arm64@1.0.0-beta.53':
resolution: {integrity: sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==} resolution: {integrity: sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==}
@ -1229,8 +1230,8 @@ packages:
peerDependencies: peerDependencies:
solid-js: ^1.6.12 solid-js: ^1.6.12
'@stylistic/eslint-plugin@5.7.1': '@stylistic/eslint-plugin@5.7.0':
resolution: {integrity: sha512-zjTUwIsEfT+k9BmXwq1QEFYsb4afBlsI1AXFyWQBgggMzwBFOuu92pGrE5OFx90IOjNl+lUbQoTG7f8S0PkOdg==} resolution: {integrity: sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: '>=9.0.0' eslint: '>=9.0.0'
@ -1430,49 +1431,41 @@ packages:
resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@unrs/resolver-binding-linux-arm64-musl@1.11.1': '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-musl@1.11.1': '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [musl]
'@unrs/resolver-binding-linux-s390x-gnu@1.11.1': '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@unrs/resolver-binding-linux-x64-gnu@1.11.1': '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@unrs/resolver-binding-linux-x64-musl@1.11.1': '@unrs/resolver-binding-linux-x64-musl@1.11.1':
resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@unrs/resolver-binding-wasm32-wasi@1.11.1': '@unrs/resolver-binding-wasm32-wasi@1.11.1':
resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
@ -2434,6 +2427,10 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@5.0.0:
resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
eslint@9.39.2: eslint@9.39.2:
resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -2448,6 +2445,10 @@ packages:
resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
espree@11.1.0:
resolution: {integrity: sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
esquery@1.6.0: esquery@1.6.0:
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
engines: {node: '>=0.10'} engines: {node: '>=0.10'}
@ -2778,8 +2779,8 @@ packages:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true hasBin: true
hono@4.11.7: hono@4.11.4:
resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} resolution: {integrity: sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==}
engines: {node: '>=16.9.0'} engines: {node: '>=16.9.0'}
hosted-git-info@4.1.0: hosted-git-info@4.1.0:
@ -3235,28 +3236,24 @@ packages:
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.30.2: lightningcss-linux-arm64-musl@1.30.2:
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.30.2: lightningcss-linux-x64-gnu@1.30.2:
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.30.2: lightningcss-linux-x64-musl@1.30.2:
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.30.2: lightningcss-win32-arm64-msvc@1.30.2:
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
@ -5152,6 +5149,11 @@ snapshots:
dependencies: dependencies:
'@ghostery/adblocker-extended-selectors': 2.13.4 '@ghostery/adblocker-extended-selectors': 2.13.4
'@ghostery/adblocker-electron-preload@2.11.6(electron@38.7.2)':
dependencies:
'@ghostery/adblocker-content': 2.13.4
electron: 38.7.2
'@ghostery/adblocker-electron-preload@2.13.4(electron@38.7.2)': '@ghostery/adblocker-electron-preload@2.13.4(electron@38.7.2)':
dependencies: dependencies:
'@ghostery/adblocker-content': 2.13.4 '@ghostery/adblocker-content': 2.13.4
@ -5180,34 +5182,34 @@ snapshots:
dependencies: dependencies:
tldts-experimental: 7.0.19 tldts-experimental: 7.0.19
'@hono/node-server@1.19.9(hono@4.11.7)': '@hono/node-server@1.19.9(hono@4.11.4)':
dependencies: dependencies:
hono: 4.11.7 hono: 4.11.4
'@hono/node-ws@1.2.0(@hono/node-server@1.19.9(hono@4.11.7))(bufferutil@4.1.0)(hono@4.11.7)(utf-8-validate@6.0.6)': '@hono/node-ws@1.2.0(@hono/node-server@1.19.9(hono@4.11.4))(bufferutil@4.1.0)(hono@4.11.4)(utf-8-validate@6.0.6)':
dependencies: dependencies:
'@hono/node-server': 1.19.9(hono@4.11.7) '@hono/node-server': 1.19.9(hono@4.11.4)
hono: 4.11.7 hono: 4.11.4
ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
'@hono/swagger-ui@0.5.3(hono@4.11.7)': '@hono/swagger-ui@0.5.3(hono@4.11.4)':
dependencies: dependencies:
hono: 4.11.7 hono: 4.11.4
'@hono/zod-openapi@1.2.0(hono@4.11.7)(zod@4.2.1)': '@hono/zod-openapi@1.2.0(hono@4.11.4)(zod@4.2.1)':
dependencies: dependencies:
'@asteasolutions/zod-to-openapi': 8.1.0(zod@4.2.1) '@asteasolutions/zod-to-openapi': 8.1.0(zod@4.2.1)
'@hono/zod-validator': 0.7.6(hono@4.11.7)(zod@4.2.1) '@hono/zod-validator': 0.7.6(hono@4.11.4)(zod@4.2.1)
hono: 4.11.7 hono: 4.11.4
openapi3-ts: 4.5.0 openapi3-ts: 4.5.0
zod: 4.2.1 zod: 4.2.1
'@hono/zod-validator@0.7.6(hono@4.11.7)(zod@4.2.1)': '@hono/zod-validator@0.7.6(hono@4.11.4)(zod@4.2.1)':
dependencies: dependencies:
hono: 4.11.7 hono: 4.11.4
zod: 4.2.1 zod: 4.2.1
'@humanfs/core@0.19.1': {} '@humanfs/core@0.19.1': {}
@ -5658,13 +5660,13 @@ snapshots:
dependencies: dependencies:
solid-js: 1.9.10 solid-js: 1.9.10
'@stylistic/eslint-plugin@5.7.1(eslint@9.39.2(jiti@2.6.1))': '@stylistic/eslint-plugin@5.7.0(eslint@9.39.2(jiti@2.6.1))':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
'@typescript-eslint/types': 8.53.1 '@typescript-eslint/types': 8.53.1
eslint: 9.39.2(jiti@2.6.1) eslint: 9.39.2(jiti@2.6.1)
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 5.0.0
espree: 10.4.0 espree: 11.1.0
estraverse: 5.3.0 estraverse: 5.3.0
picomatch: 4.0.3 picomatch: 4.0.3
@ -7117,6 +7119,8 @@ snapshots:
eslint-visitor-keys@4.2.1: {} eslint-visitor-keys@4.2.1: {}
eslint-visitor-keys@5.0.0: {}
eslint@9.39.2(jiti@2.6.1): eslint@9.39.2(jiti@2.6.1):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
@ -7164,6 +7168,12 @@ snapshots:
acorn-jsx: 5.3.2(acorn@8.15.0) acorn-jsx: 5.3.2(acorn@8.15.0)
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
espree@11.1.0:
dependencies:
acorn: 8.15.0
acorn-jsx: 5.3.2(acorn@8.15.0)
eslint-visitor-keys: 5.0.0
esquery@1.6.0: esquery@1.6.0:
dependencies: dependencies:
estraverse: 5.3.0 estraverse: 5.3.0
@ -7542,7 +7552,7 @@ snapshots:
he@1.2.0: {} he@1.2.0: {}
hono@4.11.7: {} hono@4.11.4: {}
hosted-git-info@4.1.0: hosted-git-info@4.1.0:
dependencies: dependencies:

View File

@ -227,7 +227,7 @@
}, },
"album-actions": { "album-actions": {
"description": "Lisab Undislike, Ebameeldiv, Meeldiv ja Unlike nupud selle rakendamiseks kõikidele loendisse või albumisse kuuluvatele lauludele.", "description": "Lisab Undislike, Ebameeldiv, Meeldiv ja Unlike nupud selle rakendamiseks kõikidele loendisse või albumisse kuuluvatele lauludele.",
"name": "Albumi toimingud" "name": "Albumi aktsioonid"
}, },
"album-color-theme": { "album-color-theme": {
"description": "Rakendab dünaamilist teemat ja visuaalseid efekte, mis põhinevad albumi värvipalettil", "description": "Rakendab dünaamilist teemat ja visuaalseid efekte, mis põhinevad albumi värvipalettil",
@ -237,8 +237,7 @@
"submenu": { "submenu": {
"percent": "{{suhe}}%" "percent": "{{suhe}}%"
} }
}, }
"enable-seekbar": "Luba kerimisriba kujundamine"
}, },
"name": "Albumi värviteema" "name": "Albumi värviteema"
}, },
@ -246,19 +245,9 @@
"description": "Rakendab valgusefekti, projitseerides videost õrnad värvid ekraani taustale", "description": "Rakendab valgusefekti, projitseerides videost õrnad värvid ekraani taustale",
"menu": { "menu": {
"blur-amount": { "blur-amount": {
"label": "Hägusus", "label": "Hägusus"
"submenu": {
"pixels": "{{blurAmount}} pikslit"
}
},
"buffer": {
"label": "Puhver",
"submenu": {
"buffer": "{{buffer}}"
}
}, },
"opacity": { "opacity": {
"label": "Läbipaistmatus",
"submenu": { "submenu": {
"percent": "{{opacity}}%" "percent": "{{opacity}}%"
} }
@ -274,15 +263,8 @@
"submenu": { "submenu": {
"percent": "{{size}}%" "percent": "{{size}}%"
} }
},
"smoothness-transition": {
"label": "Sujuv üleminek"
},
"use-fullscreen": {
"label": "Kasutamas täisekraani"
} }
}, }
"name": "Ümbritsev režiim"
}, },
"blur-nav-bar": { "blur-nav-bar": {
"description": "Muudab navigatsiooniriba läbipaistavaks ja hägusaks", "description": "Muudab navigatsiooniriba läbipaistavaks ja hägusaks",

View File

@ -209,7 +209,7 @@
"show": "Pokaż okno", "show": "Pokaż okno",
"tooltip": { "tooltip": {
"default": "{{applicationName}}", "default": "{{applicationName}}",
"with-song-info": "{{title}} (autorstwa {{artist}}) - {{applicationName}}" "with-song-info": "{{artist}} - (autorstwa {{artist}}) - {{applicationName}}"
} }
} }
}, },
@ -295,7 +295,7 @@
} }
}, },
"api-server": { "api-server": {
"description": "Steruj odtwarzaczem przez specjalny serwer API", "description": "Pozwala na kontrolowanie {{applicationName}} poprzez podłączenie specjalnego serwera API",
"dialog": { "dialog": {
"request": { "request": {
"buttons": { "buttons": {

View File

@ -1,144 +0,0 @@
import { test, expect } from '@playwright/test';
import { LRC } from './lrc';
test('empty string', () => {
const lrc = LRC.parse('');
expect(lrc).toStrictEqual({ lines: [], tags: [] });
});
test('chorus', () => {
const lrc = LRC.parse(`\
[00:12.00]Line 1 lyrics
[00:17.20]Line 2 lyrics
[00:21.10][00:45.10]Repeating lyrics (e.g. chorus)
[mm:ss.xx]Last lyrics line\
`);
expect(lrc).toStrictEqual({
lines: [
{ duration: 12000, text: '', words: [], time: '00:00:00', timeInMs: 0 },
{
duration: 5020,
text: 'Line 1 lyrics',
words: [],
time: '00:12:00',
timeInMs: 12000,
},
{
duration: 3990,
text: 'Line 2 lyrics',
words: [],
time: '00:17:20',
timeInMs: 17020,
},
{
duration: 24000,
text: 'Repeating lyrics (e.g. chorus)',
words: [],
time: '00:21:10',
timeInMs: 21010,
},
{
duration: Infinity,
text: 'Repeating lyrics (e.g. chorus)',
words: [],
time: '00:45:10',
timeInMs: 45010,
},
],
tags: [],
});
});
test('attributes', () => {
const lrc = LRC.parse(
`[ar:Chubby Checker oppure Beatles, The]
[al:Hits Of The 60's - Vol. 2 Oldies]
[ti:Let's Twist Again]
[au:Written by Kal Mann / Dave Appell, 1961]
[length: 2:23]
[00:12.00]Naku Penda Piya-Naku Taka Piya-Mpenziwe
[00:15.30]Some more lyrics ...`,
);
expect(lrc).toStrictEqual({
lines: [
{ duration: 12000, text: '', words: [], time: '00:00:00', timeInMs: 0 },
{
duration: 3030,
text: 'Naku Penda Piya-Naku Taka Piya-Mpenziwe',
words: [],
time: '00:12:00',
timeInMs: 12000,
},
{
duration: Infinity,
text: 'Some more lyrics ...',
words: [],
time: '00:15:30',
timeInMs: 15030,
},
],
tags: [
{ tag: 'ar', value: 'Chubby Checker oppure Beatles, The' },
{ tag: 'al', value: "Hits Of The 60's - Vol. 2 Oldies" },
{ tag: 'ti', value: "Let's Twist Again" },
{ tag: 'au', value: 'Written by Kal Mann / Dave Appell, 1961' },
{ tag: 'length', value: '2:23' },
],
});
});
test('karaoke', () => {
const lrc = LRC.parse(
'[00:00.00] <00:00.04> When <00:00.16> the <00:00.82> truth <00:01.29> is <00:01.63> found <00:03.09> to <00:03.37> be <00:05.92> lies',
);
expect(lrc).toStrictEqual({
lines: [
{
duration: Infinity,
text: 'When the truth is found to be lies',
time: '00:00:00',
timeInMs: 0,
words: [
{
timeInMs: 4,
word: 'When',
},
{
timeInMs: 16,
word: 'the',
},
{
timeInMs: 82,
word: 'truth',
},
{
timeInMs: 1029,
word: 'is',
},
{
timeInMs: 1063,
word: 'found',
},
{
timeInMs: 3009,
word: 'to',
},
{
timeInMs: 3037,
word: 'be',
},
{
timeInMs: 5092,
word: 'lies',
},
],
},
],
tags: [],
});
});

View File

@ -8,7 +8,6 @@ interface LRCLine {
timeInMs: number; timeInMs: number;
duration: number; duration: number;
text: string; text: string;
words: { timeInMs: number; word: string }[];
} }
interface LRC { interface LRC {
@ -18,10 +17,7 @@ interface LRC {
const tagRegex = /^\[(?<tag>\w+):\s*(?<value>.+?)\s*\]$/; const tagRegex = /^\[(?<tag>\w+):\s*(?<value>.+?)\s*\]$/;
// prettier-ignore // prettier-ignore
const timestampRegex = /^\[(?<minutes>\d+):(?<seconds>\d+)\.(?<milliseconds>\d+)\]/m; const lyricRegex = /^\[(?<minutes>\d+):(?<seconds>\d+)\.(?<milliseconds>\d+)\](?<text>.+)$/;
// prettier-ignore
const wordRegex = /<(?<minutes>\d+):(?<seconds>\d+)\.(?<milliseconds>\d+)> *(?<word>\w+)/g;
export const LRC = { export const LRC = {
parse: (text: string): LRC => { parse: (text: string): LRC => {
@ -31,29 +27,13 @@ export const LRC = {
}; };
let offset = 0; let offset = 0;
let previousLine: LRCLine | null = null;
for (let line of text.split('\n')) { for (const line of text.split('\n')) {
line = line.trim(); if (!line.trim().startsWith('[')) continue;
if (!line.startsWith('[')) continue;
const timestamps = []; const lyric = line.match(lyricRegex)?.groups;
let match: Record<string, string> | undefined; if (!lyric) {
while ((match = line.match(timestampRegex)?.groups)) {
const { minutes, seconds, milliseconds } = match;
const timeInMs =
parseInt(minutes) * 60 * 1000 +
parseInt(seconds) * 1000 +
parseInt(milliseconds);
timestamps.push({
time: `${minutes}:${seconds}:${milliseconds}`,
timeInMs,
});
line = line.replace(timestampRegex, '');
}
if (!timestamps.length) {
const tag = line.match(tagRegex)?.groups; const tag = line.match(tagRegex)?.groups;
if (tag) { if (tag) {
if (tag.tag === 'offset') { if (tag.tag === 'offset') {
@ -69,52 +49,38 @@ export const LRC = {
continue; continue;
} }
let text = line.trim(); const { minutes, seconds, milliseconds, text } = lyric;
const words = Array.from(text.matchAll(wordRegex), ({ groups }) => { const timeInMs =
const { minutes, seconds, milliseconds, word } = groups!; parseInt(minutes) * 60 * 1000 +
const timeInMs = parseInt(seconds) * 1000 +
parseInt(minutes) * 60 * 1000 + parseInt(milliseconds);
parseInt(seconds) * 1000 +
parseInt(milliseconds);
return { timeInMs, word }; const currentLine: LRCLine = {
}); time: `${minutes}:${seconds}:${milliseconds}`,
timeInMs,
text: text.trim(),
duration: Infinity,
};
if (words.length) { if (previousLine) {
text = words.map(({ word }) => word).join(' '); previousLine.duration = timeInMs - previousLine.timeInMs;
} }
for (const { time, timeInMs } of timestamps) { previousLine = currentLine;
lrc.lines.push({ lrc.lines.push(currentLine);
time,
timeInMs,
text,
words,
duration: Infinity,
});
}
} }
lrc.lines.sort(({ timeInMs: timeA }, { timeInMs: timeB }) => timeA - timeB); for (const line of lrc.lines) {
for (let i = 0; i < lrc.lines.length; i++) { line.timeInMs += offset;
const current = lrc.lines[i];
const next = lrc.lines[i + 1];
current.timeInMs += offset;
if (next) {
current.duration = next.timeInMs - current.timeInMs;
}
} }
const first = lrc.lines.at(0); const first = lrc.lines.at(0);
if (first && first.timeInMs > 300) { if (first && first.timeInMs > 300) {
lrc.lines.unshift({ lrc.lines.unshift({
time: '00:00:00', time: '0:0:0',
timeInMs: 0, timeInMs: 0,
duration: first.timeInMs, duration: first.timeInMs,
text: '', text: '',
words: [],
}); });
} }